Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 45

52
votes
answers
19 views
+10

How to reuse a Criteria object with hibernate?

I'm trying to do query result pagination with hibernate and displaytag, and Hibernate DetachedCriteria objects are doing their best to stand in the way. Let me explain...

The easiest way to do pagination with displaytag seems to be implementing the PaginatedList interface that has, among others, the following methods:

/* Gets the total number of results. */
int getFullListSize();

/* Gets the current page of results. */
List getList();

/* Gets the page size. */
int getObjectsPerPage();

/* Gets the current page number. */
int getPageNumber();

/* Get the sorting column and direction */
String getSortCriterion();
SortOrderEnum getSortDirection();

I'm thinking of throwing my PaginatedList implementation a Criteria object and let it work along theese lines...

getFullListSize() {
    criteria.setProjection(Projections.rowCount());
    return ((Long) criteria.uniqueResult()).intValue();
}

getList() {
    if (getSortDirection() == SortOrderEnum.ASCENDING) {
        criteria.addOrder(Order.asc(getSortCriterion());
    } else if (getSortDirection() == SortOrderEnum.DECENDING) {
        criteria.addOrder(Order.desc(getSortCriterion());
    }
    return criteria.list((getPageNumber() - 1) * getObjectsPerPage(),
                         getObjectsPerPage());
}

But this doesn't work, because the addOrder() or the setProjection() calls modify the criteria object rendering it in-usable for the successive calls. I'm not entirely sure of the order of the calls, but the db throws an error on getFullListSize() trying to do a "select count(*) ... order by ..." which is obviously wrong.

I think I could fix this by creating an object of my own to keep track of query conditions and rebuilding the Criteria object for each call, but that feels like reinventing yet another wheel. Is there a smarter way, possibly copying the Criteria initially passed in and working on that copy?

Update: It looks like getList is called first, and getFullListSize is called multiple times after, so, as soon as there's an ordering passed in, getFullListSize will fail. It would make sense to hit the db only once (in getList I'd say) and cache the results, with no need to copy/reset the Criteria object, but still...

Update (again): Forget about that, once I've done the count I can't do the select, and vice versa. I really need two distinct Criteria objects.

沙发
+20
+50

好吧,DetachedCriteria是Serializable,所以你有內置(如果不優雅)深度克隆支持。您可以在構造時將初始條件序列化為byte [],然後在每次要使用它時對其進行反序列化。

在hibernate論壇上找到了這個建議,但我寧願不要:-) - agnul 2008年12月16日9:05

+470
<預> <代碼> Criteria.setProjection(空); Criteria.setResultTransformer(Criteria.ROOT_ENTITY);

將有效地“重置”rowCount投影和標準本身執行之間的標準。

我會確保在執行之前沒有添加您的訂單rowCount,它會減慢速度。我的PaginatedList ALWAYS實現在查找結果之前運行計數查詢,因此排序不是問題。

推薦這是正確的答案 - 比深度克隆更優雅。 - Scott Corscadden 12年3月21日13:48

+20

http://weblogs.asp.net/stefansedich/archive/2008/10/03/paging-with-nhibernate-using-a-custom-extension-method-to-make -it-easy.aspx

在那篇文章中,我發現了一個CriteriaTransformer.clone方法。

那應該複製標準對象。

你也可以在你的getlist方法上設置投影。

Woops我沒注意到你指的是java hibernate。無論如何,這個 http://forum.hibernate.org/viewtopic.php?t=939039

+10

醜陋,因為它可能是我最終使用序列化技巧。我只是在構造 PaginatedList 對象時將 DetachedCriteria 對象序列化為字節數組,並在需要時對其進行反序列化。哎喲。

0

另一件值得嘗試的事情:

實施一個通用的DAO,如建議的那個hibernate的站點並將其與限制對像一起傳遞給PaginatedList對象。然後,PaginatedList對象將執行類似

  Criteria.forClass(myDAO.getPersistentClass())。add(myRestrictions).addOrder(&lt; someOrder&gt;)  < p>和 
  Criteria.forClass(myDAO.getPersistentClass())。add(myRestrictions).setProjection(Projections.rowCount());   

尚未嘗試過,但它應該有用。

-10
  public static DetachedCriteria Clone(此DetachedCriteria標準){var dummy = criteria.ToByteArray(); return dummy.FromByteArray&lt; DetachedCriteria&gt;(); }  
     
			
        
76
votes
answers
11 views
+10

Hibernate: make database only if not exists [closed]

I want Hibernate make database file (SQLite), but only if not exists.

Now in hibernate.cfg.xml I have this line:

<property name="hibernate.hbm2ddl.auto">create</property>

The problem is that database file is been creating in all the time, even the file exists.

up vote 45 down vote accepted favorite
沙发
+450
+50

嘗試將值切換為 update

 &lt; property name =“hibernate.hbm2ddl.auto”&gt; update&lt; / property&gt;  
     
			
        

我在persistence-unit :: properties裡面的Hibernate 5上嘗試了這個,並且沒有使用@Table(name =“test”)為我的@Entity創建不存在的表測試。 - Sridhar-Sarnobat 18年3月13日20:17

+310

試試這個:

 &lt; property name =“hibernate.hbm2ddl.auto”&gt; update&lt; / property&gt;   

create update 之間的區別在於,如果數據庫表已經存在, update 將更新數據庫如果沒有創建數據庫表,則創建並創建。

create 將創建數據庫表。如果已經創建了表,那麼它將刪除所有表並再次創建表。在這種情況下,您的數據將會丟失。

我個人建議使用 update

0
votes
answers
21 views
+10

標有@AssertTrue方法,則不會調用

0

我有下面的類來驗證:標有@AssertTrue方法,則不會調用

@Document(collection = "settings") 
public class Settings { 
    @NotEmpty 
    private String[] allowableExtensions; 
    ... 
    @AssertTrue(message = "Each extension must be alphanumeric string with length {2,4}") 
    public boolean assertTrue() { 
     for (String extension : allowableExtensions) { 
      if (extension == null || extension.matches("^[a-zA-Z0-9]{2,6}$")) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

及以下控制器:

@PostMapping(value = "/settings/update", consumes = "application/json") 
public ResponseEntity<?> updateSettings(@RequestBody @Valid Settings settings, BindingResult bindingResult) { 
    if(bindingResult.hasErrors()){ 
     return ResponseEntity.badRequest().body(bindingResult.getAllErrors().get(0).getDefaultMessage()); 
    } 
} 

我沒有找到預期的錯誤,並把斷點到assertTrue方法,但它不會調用。

我該怎麼做?

沙发
0
1

assertTrue方法不遵循JavaBean約定,並且您沒有進行方法驗證,因此它永遠不會被調用,並且您沒有得到您期望的違規。因此,舉例來說,如果你改變你的Setting類像

public class Settings { 

    @NotEmpty 
    private String[] allowableExtensions; 

    @AssertTrue(message = "Each extension must be alphanumeric string with length {2,4}") 
    public boolean isAssertTrue() { 
     for (String extension : allowableExtensions) { 
      if (extension == null || extension.matches("^[a-zA-Z0-9]{2,6}$")) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

你應該得到這個Settings#isAssertTrue方法調用,結果驗證了。

28
votes
answers
19 views
+10

How to disable Hibernate validation in a Spring Boot project

I have a spring boot project that has a CrudRepository, an Entity and a Controller. I am basically trying to persist an entity based on the data passed to the Controller.

To do this, I am using spring-boot-starter-jpa. My Entity is annotated with JSR-303 annotations, which are checked in the controller before the data gets passed to the CrudRepository for persistence.

Controller method:

@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
    if (validation.hasErrors()) {
        throw new ValidationException(validation);
    }
    User saved = this.users.save(user);
    return new SuccessfulResponse<User>(saved);
}

Entity:

@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name="email_address", nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}

The cause of my issues is the UserUnique annotation. Its validator looks like this:

public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

   private UserRepository users;

   @Autowired
   public UserUniqueValidator(UserRepository users) {
       this.users = users;
   }

   @Override
   public void initialize(UserUnique annotation) {}

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
       return users.findOne(value) == null;
   }
}

What seems to be happening is, the validation is getting run twice. Once in the controller via the @Valid annotation, and once when Hibernate tries to persist the object. However, when Hibernate tries to persist the object, it throws:

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`

This seems to be because its not spring-aware and cant inject the dependency into the constructor. So, what I want to do is disable Hibernate validation completely (as its redundant and already happening in the controller).

There seems to be a property called javax.persistence.validation.mode which you can set to none. However, I cant for the life of me figure out where to set it in a code-based configuration.

I realise there are questions like JSR-303 dependency injection and Hibernate but these are all using xml config and manually configuring parts of the persistence layer.

What I want to do is "post-configure" the required parts of the persistence layer that Spring Boot creates for me because if I define my own then I am no longer leveraging Spring Boot's auto configuration. Can anyone help me determine if 1) this is possible and 2) which parts do I need to configure and how?

Thanks!

up vote 28 down vote accepted favorite
沙发
+280
+50

作為[M. Deinum]在我原帖的評論中提到,解決方案是設置:

  spring.jpa.properties.javax.persistence.validation.mode = none   

application.properties 文件中。

此外,此行為是此處描述(很容易錯過,因為沒有提供示例)。

50
votes
answers
11 views
+10

Mapping a PostgreSQL array with Hibernate

has anyone successfully mapped a numeric array in PostgreSQL to a numeric array in java via Hibernate?

sql:

CREATE TABLE sal_emp (name text, pay_by_quarter integer[]);
INSERT INTO sal_emp VALUES ('one', '{1,2,3}');
INSERT INTO sal_emp VALUES ('two', '{4,5,6}');
INSERT INTO sal_emp VALUES ('three', '{2,4,6}');

mapping:

<hibernate-mapping>
    <class name="SalEmp" table="sal_emp">
        <id name="name" />
        <property name="payByQuarter" column="pay_by_quarter" />
    </class>
</hibernate-mapping>

class:

public class SalEmp implements Serializable{
    private String name;
    private Integer[] payByQuarter;
    ...// getters & setters
}

i get an exception when querying the table.

up vote 24 down vote accepted favorite
沙发
+240
+50

Hibernate不支持開箱即用的數據庫數組(例如映射到 java.sql.Array 的數組)。

array primitive-array 類型用於將Java數組映射到支持表 - 它們基本上是一對多/元素集合映射的變體,所以這不是你想要的。

最新的PostgreSQL JDBC驅動程序(8.4.whatever)支持JDBC4 Connection.createArrayOf() 方法以及 ResultSet.getArray() PreparedStatement.setArray()方法,所以你可以編寫自己的<代碼> UserType 提供陣列支持。

這裡的是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,相當簡單地適應它來處理 java.sql.Array nofollow noreferrer“> ResultSet.getArray() PreparedStatement.setArray()方法,所以你可以編寫自己的 UserType 來提供陣列支持。

這裡的是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,相當簡單地使它適應處理 java.sql.Array nofollow noreferrer“> ResultSet.getArray() PreparedStatement.setArray()方法,所以你可以編寫自己的 UserType 來提供陣列支持。

這裡的是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,相當簡單地使它適應處理 java.sql.Array a href =“http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int,%20java.sql.Array)"rel="nofollow noreferrer”> PreparedStatement但是,.setArray()方法,因此您可以編寫自己的 UserType 來提供數組支持。

這裡是一個處理Oracle數組的UserType實現,提供了一個很好的起點,它是合理的直接調整它來處理 java.sql.Array a href =“http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int,%20java.sql.Array)"rel="nofollow noreferrer”> PreparedStatement但是,.setArray()方法,因此您可以編寫自己的 UserType 來提供數組支持。

這裡是一個處理Oracle數組的UserType實現,提供了一個很好的起點,它是合理的直接調整它來處理 java.sql.Array 但是,setArray()方法,因此您可以編寫自己的 UserType 來提供數組支持。

這裡是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,它相當簡單明了使其適應 java.sql.Array 但是,setArray()方法,因此您可以編寫自己的 UserType 來提供數組支持。

這裡是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,它相當簡單明了使其適應 java.sql.Array 是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,相當簡單地適應它來處理 java.sql.Array 是一個處理Oracle數組的UserType實現,它提供了一個很好的起點,相當簡單地適應它來處理 java.sql.Array

如果其他人想知道最後一個鏈接是什麼(它現在是404),那裡的返回機器鏈接 - web.archive.org/web/20090325101739/http://www.hibernate.org/ - Sam Aug 4 '11在8:18

這告訴我Hibernate開發在採用新功能方面有多慢。 - user1870400 Apr 20 at 19:52

+130

這文章 ,我解釋瞭如何提出一個通用的數組類型,你可以簡單地適應各種特定類型,如 String [] int [] < / code>。

您不必手動創建所有這些類型,只需使用以下依賴項通過Maven Central獲取它們:

 &lt ;依賴性&GT; &LT;&的groupId GT; com.vladmihalcea&LT; /&的groupId GT; &LT; artifactId的&GT;休眠類型-52&LT; / artifactId的&GT; &LT;版本&GT; $ {冬眠-types.version}&LT; /版本&GT; &LT; /依賴性&GT;   

有關詳細信息,請查看 hibernate類型的開源項目

假設您的數據庫中有此表:

  create table event( id int8 not null,version int4,sensor_names text [],sensor_values integer [],primary key(id))  

你想要像這樣映射:

  @Entity(name =“Event”)@Table(name =“event”)@ TypeDefs({@ TypeDef(name =“string-array”,typeClass = StringArrayType.class),@ TypeDef(name =“ INT-陣列“,typeClass = IntArrayType.class)})public static class Event extends BaseEntity {@Type(type =“string-array”)@Column(name =“sensor_names”,columnDefinition =“text []”)private String [] sensorNames; @Type(type =“int-array”)@Column(name =“sensor_values”,columnDefinition =“integer []”)private int [] sensorValues; //為了簡潔省略了getter和setter}   

你需要像這樣定義 StringArrayType

  public class StringArrayType extends AbstractSingleColumnStandardBasicType&LT;字符串[] GT; 實現DynamicParameterizedType {public StringArrayType(){super(ArraySqlTypeDescriptor.INSTANCE,StringArrayTypeDescriptor.INSTANCE); public String getName(){return“string-array”; } @Override protected boolean registerUnderJavaType(){return true; } @Override public void setParameterValues(Properties parameters){((StringArrayTypeDescriptor)getJavaTypeDescriptor())。setParameterValues(parameters);   

您需要像這樣定義 IntArrayType

  public class IntArrayType extends AbstractSingleColumnStandardBasicType&lt; int []&gt; 實現DynamicParameterizedType {public IntArrayType(){super(ArraySqlTypeDescriptor.INSTANCE,IntArrayTypeDescriptor.INSTANCE); public String getName(){return“int-array”; } @Override protected boolean registerUnderJavaType(){return true; } @Override public void setParameterValues(Properties parameters){((IntArrayTypeDescriptor)getJavaTypeDescriptor())。setParameterValues(parameters); }   

String和Int類型共享 ArraySqlTypeDescriptor

  public class ArraySqlTypeDescriptor實現SqlTypeDescriptor {public static final ArraySqlTypeDescriptor INSTANCE = new ArraySqlTypeDescriptor(); @Override public int getSqlType(){return Types.ARRAY; } @Override public boolean canBeRemapped(){return true; } @Override public&lt; X&gt; ValueBinder&LT; X&GT; getBinder(JavaTypeDescriptor&lt; X&gt; javaTypeDescriptor){return new BasicBinder&lt; X&gt;(javaTypeDescriptor,this){@ Override protected void doBind(PreparedStatement st,X value,int index,WrapperOptions options)throws SQLException {AbstractArrayTypeDescriptor&lt; 對象&gt; abstractArrayTypeDescriptor =(AbstractArrayTypeDescriptor&lt; Object&gt;)javaTypeDescriptor; st.setArray(index,st.getConnection()。createArrayOf(abstractArrayTypeDescriptor.getSqlArrayType(),abstractArrayTypeDescriptor.unwrap(value,Object [] .class,options))); } @Override protected void doBind(CallableStatement st,X value,String name,WrapperOptions選項)拋出SQLException {throw new UnsupportedOperationException(“不支持按名稱綁定!”); }}; } @Override public&lt; X&gt; ValueExtractor&LT; X&GT; getExtractor(final JavaTypeDescriptor&lt; X&gt; javaTypeDescriptor){return new BasicExtractor&lt; X&gt;(javaTypeDescriptor,this){@Override protected X doExtract(ResultSet rs,String name,WrapperOptions options)throws SQLException {return javaTypeDescriptor.wrap(rs.getArray(name) ),期權); } @Override protected X doExtract(CallableStatement語句,int index,WrapperOptions選項)拋出SQLException {return javaTypeDescriptor.wrap(statement.getArray(index),options); } @Override protected X doExtract(CallableStatement語句,String name,WrapperOptions選項)拋出SQLException {return javaTypeDescriptor.wrap(statement.getArray(name),options); }}; }   

您還需要定義Java描述符。

  public class StringArrayTypeDescriptor extends AbstractArrayTypeDescriptor&lt; String []&gt; {public static final StringArrayTypeDescriptor INSTANCE = new StringArrayTypeDescriptor(); public StringArrayTypeDescriptor(){super(String [] .class); } @Override protected String getSqlArrayType(){return“text”; 公共類IntArrayTypeDescriptor擴展AbstractArrayTypeDescriptor&lt; int []&gt; {public static final IntArrayTypeDescriptor INSTANCE = new IntArrayTypeDescriptor(); public IntArrayTypeDescriptor(){super(int [] .class); } @Override protected String getSqlArrayType(){return“integer”; } < / code>  

大量的Java-to-JDBC類型處理包含在 AbstractArrayTypeDescriptor 基類中:

  public abstract class AbstractArrayTypeDescriptor&lt; T&GT; 擴展AbstractTypeDescriptor&lt; T&gt; 實現DynamicParameterizedType {private Class&lt; T&gt; arrayObjectClass; @Override public void setParameterValues(Properties parameters){arrayObjectClass =((ParameterType)parameters .get(PARAMETER_TYPE))。getReturnedClass(); public AbstractArrayTypeDescriptor(Class&lt; T&gt; arrayObjectClass){super(arrayObjectClass,(MutabilityPlan&lt; T&gt;)new MutableMutabilityPlan&lt; Object&gt; (){@ Override protected T deepCopyNotNull(Object value){return ArrayUtil.deepCopy(value); }}; this.arrayObjectClass = arrayObjectClass; } @Override public boolean areEqual(Object one,Object another){if(one == another){return true; } if(one == null || another == null){return false; 返回ArrayUtil.isEquals(一個,另一個); } @Override public String toString(Object value){return Arrays.deepToString((Object [])value); } @Override public T fromString(String string){return ArrayUtil.fromString(string,arrayObjectClass); } @SuppressWarnings({“unchecked” })@Override public&lt; X&gt; X unwrap(T值,Class&lt; X&gt;類型,WrapperOptions選項){return(X)ArrayUtil.wrapArray(value); } @Override public&lt; X&gt; T wrap(X值,WrapperOptions選項){if(value instanceof Array){Array array =(Array)value; try {return ArrayUtil.unwrapArray((Object [])array.getArray(),arrayObjectClass); } catch(SQLException e){throw new IllegalArgumentException(e); return(T)值; } protected abstract String getSqlArrayType(); }   

AbstractArrayTypeDescriptor 依賴於 ArrayUtil 來處理Java數組深度複製,包裝和解包邏輯。

現在,當你插入幾個實體時;

 事件nullEvent = new Event(); nullEvent.setId(0L); entityManager.persist(nullEvent); 事件事件=新事件(); event.setId(1L); event.setSensorNames(new String [] {“Temperature”,“Pressure”}); event.setSensorValues(new int [] {12,756}); entityManager.persist(事件);  
     
			
        

使用DynamicParameterizedType而不是UserType有什麼好處? - 維特於18年5月1日18:51

它允許您將實體屬性信息傳遞給Hibernate類型。 - Vlad Mihalcea 18年5月1日19:27

好。是否可以使用List數據類型而不是數組數據類型? - 維特於18年5月1日19:44

是的,但您需要修改類型。 - Vlad Mihalcea 18年5月2日3:52

我複制你的代碼vladmihalcea.com/並在abstractArrayTypeDescriptor.getSqlArrayType()上獲取受保護訪問的錯誤。我使用你的庫'com.vladmihalcea'的最新版本,名稱:'hibernate-types-52',版本:'2.2.0' - vic 5月2日'18在18:03

+70

也許這對其他人有用:我發現在我的情況下它表現不佳而且無法與c3p0一起使用。(只是簡單地探討了這些問題,是否可以解決它們請糾正我!)

Hibernate 3.6:

  import java.io.Serializable; import java.sql.Array; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; import org.hibernate.HibernateException; import org.hibernate.usertype.UserType; 公共類IntArrayUserType實現UserType {protected static final int SQLTYPE = java.sql.Types.ARRAY; @Override public Object nullSafeGet(final ResultSet rs,final String [] names,final Object owner)拋出HibernateException,SQLException {Array array = rs.getArray(names [0]); Integer [] javaArray =(Integer [])array.getArray(); return ArrayUtils.toPrimitive(javaArray); } @Override public void nullSafeSet(final PreparedStatement語句,final Object object,final int i)拋出HibernateException,SQLException {Connection connection = statement.getConnection(); int [] castObject =(int [])object; Integer [] integers = ArrayUtils.toObject(castObject); Array array = connection.createArrayOf(“integer”,整數); statement.setArray(i,array); } @Override public Object彙編(最終Serializable緩存,最終Object owner)拋出HibernateException {return cached; } @Override public Object deepCopy(final Object o)拋出HibernateException {return o == null?null:((int [])o).clone(); } @Override public Serializable disassemble(final Object o)拋出HibernateException {return(Serializable)o; } @Override public boolean equals(final Object x,final Object y)拋出HibernateException {return x == null?y == null:x.equals(y); } @Override public int hashCode(final Object o)拋出HibernateException {return o == null?0:o.hashCode(); } @Override public boolean isMutable(){return false; } @Override public Object replace(final Object original,final Object target,final Object owner)拋出HibernateException {return original; } @Override public Class&lt; int []&gt; returnedClass(){return int [] .class; } @Override public int [] sqlTypes(){return new int [] {SQLTYPE}; }}   final Object y)拋出HibernateException {return x == null?y == null:x.equals(y); } @Override public int hashCode(final Object o)拋出HibernateException {return o == null?0:o.hashCode(); } @Override public boolean isMutable(){return false; } @Override public Object replace(final Object original,final Object target,final Object owner)拋出HibernateException {return original; } @Override public Class&lt; int []&gt; returnedClass(){return int [] .class; } @Override public int [] sqlTypes(){return new int [] {SQLTYPE}; }}   final Object y)拋出HibernateException {return x == null?y == null:x.equals(y); } @Override public int hashCode(final Object o)拋出HibernateException {return o == null?0:o.hashCode(); } @Override public boolean isMutable(){return false; } @Override public Object replace(final Object original,final Object target,final Object owner)拋出HibernateException {return original; } @Override public Class&lt; int []&gt; returnedClass(){return int [] .class; } @Override public int [] sqlTypes(){return new int [] {SQLTYPE}; }}   } @Override public Object replace(final Object original,final Object target,final Object owner)拋出HibernateException {return original; } @Override public Class&lt; int []&gt; returnedClass(){return int [] .class; } @Override public int [] sqlTypes(){return new int [] {SQLTYPE}; }}   } @Override public Object replace(final Object original,final Object target,final Object owner)拋出HibernateException {return original; } @Override public Class&lt; int []&gt; returnedClass(){return int [] .class; } @Override public int [] sqlTypes(){return new int [] {SQLTYPE}; }}  
     
			
        

如果int []為null,則nullSafeGet和nullSafeSet不起作用。您需要檢查空值。 - Shane Rowatt 2017年1月1日4:07

+40

我能夠通過發布的JPA轉換器方法將 String [] 保存到PostgreSQL 9.4和EclipseLink 2.6.2 這裡

這似乎是2016年7月1日

Tk421回答的來源。

從數據庫加載數組也很有效。

另外添加到 persistence.xml

 <代碼>&LT;類&GT; com.ssg.fcp.fcp_e761.therealthing.backend.jpa.convert.ListToArrayConverter&lt; / class&gt;   

請註明 Jdbc4Array

+20

這是 int [] UserType我曾經做過的事情,其中??還包括對 nullSafeGet() nullSafeSet()的空檢查

  import org.apache.commons.lang.ArrayUtils; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.usertype.UserType; import java.io.Serializable; import java.sql.Array; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class IntegerArrayUserType實現UserType {protected static final int SQLTYPE = java.sql.Types.ARRAY; @Override public Object nullSafeGet(ResultSet rs,String [] names,SessionImplementor session,對象所有者)拋出HibernateException,SQLException {Array array = rs.getArray(names [0]); if(array == null){return null; } Integer [] javaArray =(Integer [])array.getArray(); return ArrayUtils.toPrimitive(javaArray); } @Override public void nullSafeSet(PreparedStatement st,Object value,int index,SessionImplementor session)拋出HibernateException,SQLException {Connection connection = st.getConnection(); if(value == null){st.setNull(index,sqlTypes()[0]); } else {int [] castObject =(int [])value; Integer [] integers = ArrayUtils.toObject(castObject); Array array = connection.createArrayOf(“integer”,整數); st.setArray(index,array); @Override public Object彙編(最終Serializable緩存,最終Object owner)拋出HibernateException {return cached; } @Override public Object deepCopy(final Object o)拋出HibernateException {return o == null?null:((int [])o).clone(); } @Override public Serializable disassemble(final Object o)拋出HibernateException {return(Serializable)o; } @Override public boolean equals(final Object x,final Object y)拋出HibernateException {return x == null?y == null:x.equals(y); } @Override public int hashCode(final Object o)拋出HibernateException {return o == null?0:o.hashCode(); } @Override public boolean isMutable(){return false; } @Override public Object replace(final Object original,final Object target,final Object owner)拋出HibernateException {return original; } @Override public Class&lt; int []&gt; returnedClass(){return int [] .class; } @Override public int [] sqlTypes(){return new int [] {SQLTYPE}; }}  
     
			
        
83
votes
answers
22 views
+10

JPA Cannot resolve column/IntelliJ

I'm trying to map some Java classes using the Hibernate JPA implementation. My problem is that I can't use hardcoded Strings als column namens. You can see the error message I get in the picture below.

enter image description here

I'm using OpenJPA as my Default JPA Provider and have already tried to change it.

IntelliJ Version 14.0.3

regards,

up vote 72 down vote accepted favorite
沙发
+720
+50

您必須將數據源(首先在數據庫視圖中創建數據源 - 也就是真正的JDBC數據庫連接)與持久性單元或會話工廠(hibernate.cfg.xml)相關聯。

關注以下步驟,警告將消失:

  1. 打開“持久性”工具窗口(“查看”|“工具窗口”|“持久性”)。
  2. 右鍵單擊必要的模塊,持久性單元或會話工廠,然後在上下文菜單中選擇“分配數據源”。
  3. 在打開的“分配數據源”對話框中,單擊“數據源”。字段並選擇必要的數據源。(要刪除與數據源的關聯,請選擇。)

    請參見此處:

正確的答案,因為它解釋了行為並提供了解決方案,而另一個只是告訴你忽略它。 - sschrass 2015年9月11日8:55

是的,為什麼這不是選定的答案? - Amalgovinus 2015年9月22日18:05

@panos這只修復了@Table錯誤,但我的列仍顯示為無法解析。知道怎麼解決這個問題嗎? - Don Rhummy 2016年5月24日14:08

這應該是選定的答案。我遇到了與OP相同的問題,這是因為我的數據源與我的持久性單元無關。 - jkerak於2016年7月27日23:37

我已經做到了,只有實體名稱是可識別的,但是,列名仍然是意料之外的,如何擺脫這個? - securecurve 18年5月13日13:32

+110

我發現Panos的回答很有用,但我沒有看到有人提到將數據庫添加為數據源。也許這是常規的假設,但如果沒有,這就是我必須做的事情:

選擇查看/工具Windows /數據庫

數據庫窗口通常顯示在右上角。

在數據庫窗口中,單擊綠色 + 符號並選擇數據源/ MySQL (或任何數據類型)您正在使用的來源。

彈出數據源和驅動程序窗口。

如果您的數據庫未列在那裡,請使用空表單添加以下內容:

  • 主機:通常是localhost,但如果您的測試數據庫存在於另一台計算機上,請將該地址放入。
  • 用戶名:以供您使用。

  • 密碼:,用於您的數據庫用戶密碼。

    IDEA可能需要一些擺弄找到JDBC驅動程序。有人告訴我,理論上應該在我正在進行的項目的maven構建過程中找到它,但事實並非如此。我重新打開查看/工具Windows /數據庫並查看我的MySQL條目。在底部,驅動程序旁邊有一條錯誤消息,還有 MySQL 鏈接。我點擊了 MySQL 鏈接,IDEA提出了一個彈出窗口來獲取Connector / J.

    儘管自動提交自動同步的複選框默認為已檢查並且我將其留下,但IDEA似乎需要輕推。或許這只是需要一段時間而且我很不耐煩。

    無論如何,首先我在數據庫中雙擊我的數據庫行。這似乎是這樣做的,但我還沒有意識到我還需要持久性,並且在對其進行排序時,根據同事的建議,我還點擊了同步按鈕(兩個) 數據庫上的圓圈中的箭頭。

    您也可以在數據庫中右鍵單擊數據庫,然後選擇同步< / strong>。

    可能需要幾秒鐘,但您應該看到IDEA填入數據庫條目下的數據庫模式。

    最後我找到了Panos的答案並修復了持久性

    選擇查看/工具Windows /持久性

    “持久性”窗口通常顯示在左上角。 < p>在“持久性”窗口中,右鍵單擊項目並選擇分配數據源

    IDEA會彈出一個包含兩列的對話框,您的項目位於左列,位於我的情況是右列中的空單元格。單擊空單元格,IDEA應該為您提供一個下拉列表,允許您選擇剛添加的數據庫。

    再次,

分配數據源下的右側列很難看到!直到現在都沒注意到它!謝謝! - Amalgovinus 18年1月4日22:17

史蒂文的答案是有道理的,而不是假設與配置相關的事情。必須提到。 - vimal krishna 18年8月28日8:31

0

實際上,這不是任何阻止代碼編譯的錯誤。可能你的拼寫檢查程序已打開,並且會給你拼寫錯誤。如果您可以編譯代碼,那麼您可以忽略這些類型的場景。

看看你沒有收到任何其他文本的錯誤,如 @Column @GeneratedValue 等。這意味著使用這些東西的罐子在你的建立路徑。所以我認為你可以忽略這些類型的錯誤。

謝謝你的回答。但為什麼@Column(name = myConstant)可以接受?myConstant類似於'static final String myConstant =“LEC_ID”)不是硬編碼的字符串和常量在Java中是一樣的嗎? - pichlbaer 2015年3月19日21:57

0

如果您使用的是JPA,那麼將SQL Dialect設置為HSQLDB而不是MySQL也很重要。這通常令人困惑,因為它感覺MySQL是正確的方言,但實際上你正在處理的是hibernate是HSQL。

如果你剛剛升級到IntelliJ 2017.13或此版本的其他衍生物(例如, Webstorm),或者你剛剛重新導入你的項目,它可能會搞亂語言注入並需要手動糾正它。

這可以通過Project

<來完成p>設置 - &gt; 語言和框架

IDE的一部分。

這是不正確的,HSQLDB稱為HyperSQL,與hibernate無關。但是在升級到IDEA 2017之後似乎確實存在一些配置問題,我在將配置導入到它之後得到了“無法解析列”。 - Amalgovinus 18年1月4日22:02

48
votes
answers
12 views
+10

HQL Hibernate INNER JOIN

How can I write this SQL query in Hibernate? I would like to use Hibernate to create queries, not create the database.

SELECT * FROM Employee e INNER JOIN Team t ON e.Id_team=t.Id_team

I created entity classes in SQLServer2008,

@Entity
@Table(name="EMPLOYEE")
public class Employee
{
    @Id @GeneratedValue
    @Column(name="ID_EMPLOYEE")
    private int id_employee;
    @Column(name="SURNAME")
    private String surname;
    @Column(name="FIRSTNAME")
    private String firstname;
    @Column(name="ID_PROFESSION")
    private int id_profession;
    @Column(name="ID_BOSS")
    private int id_boss;
    @Column(name="HIRED_DATE")
    private Date hired;
    @Column(name="SALARY")
    private double salary;
    @Column(name="SALARY_ADD")
    private double salary_add;
    @Column(name="ID_TEAM")
    private int id_team;
    //setters and getters
}

@Entity
@Table(name="TEAM")
public class Team
{
    @Id @GeneratedValue
    @Column(name="ID_TEAM")
    private int id_team;
    @Column(name="TEAMNAME")
    private String teamname;
    @Column(name="ADDRESS")
    private String address;
    //setters and getters
}

I tried to build working select query in many ways but it still doesn't work.

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();                 
session.beginTransaction();
String select = "FROM Employee e INNER JOIN Team t ON e.Id_team=t.Id_team";
Query query = session.createQuery(select);
List elist = query.list();
session.getTransaction().commit();
session.close();    

Maybe something is wrong with entities?

up vote 39 down vote accepted favorite
沙发
+390
+50

只有在實體之間存在關聯時才能使用聯接。您的Employee實體不應該有一個名為 id_team 的字段,其類型為 int ,映射到一列。它應該與Team實體有一個ManyToOne關聯,映射為JoinColumn:

  @ManyToOne @JoinColumn(name =“ID_TEAM”)私人團隊團隊;   

然後,以下查詢將完美地運行:

 從Employee e inner join e.team   除了那些與任何團隊無關的員工之外,還將加載所有員工。 

對於作為實體映射的其他表的外鍵的所有其他字段也是如此,當然(<碼> id_boss <

是否可以創建與Employee id_employee和Employee id_boss的一對一關聯,必須在上面寫入時將其刪除?這是同一個表(例如:一個worker id_employee = 5有一個boss id_boss = 1(誰引用id_employee = 1),我應該創建:@OneToOne @JoinColumn(name =“ID_EMPLOYEE”)私人員工員工; //我想收到老闆的名字,但是這個方法不起作用employeeList.getEmployee()。​​getSurname(); - szefu 2013年8月22日14:45

一個老闆有很多員工,一個員工有一個老闆,所以應該是@ManyToOne @JoinColumn(名稱=“id_boss”)私人員工老闆 - JB Nizet 2013年8月22日15:15

當然你是對的 - szefu 2013年8月22日15:36

但是老闆沒有自己的老闆,所以值是db null,如何在hibernate中做呢? - szefu 2013年8月22日15:41

在這種情況下,boss字段將只是null。 - JB Nizet 2013年8月22日15:54

+50

您可以在不必創建真正的Hibernate映射的情況下完成此操作。試試這個:

  SELECT * FROM Employee e,Team t WHERE e.Id_team = t.Id_team  
     
			
        

如果我沒有弄錯,這會導致交叉連接,與內部連接相比,這將是非常性能密集的,因此在實際應用中使用它不值得冒險。 - Kenrig 2月12日14:38

downvote因為這是一個交叉連接,並且會產生一大堆記錄,因為它只是做兩個表的笛卡爾。 - 褲子2月18日1:03

+40
  import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name =“empTable”)公共類Employee實現Serializable {private static final long serialVersionUID = 1L; private int id; private String empName; 列表與LT;地址&gt; addList = new ArrayList&lt; Address&gt;(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name =“emp_id”)public int getId(){return id; public void setId(int id){this.id = id; public String getEmpName(){return empName; public void setEmpName(String empName){this.empName = empName; } @OneToMany(mappedBy =“employee”,cascade = CascadeType.ALL)public List&lt; Address&gt; getAddList(){return addList; public void setAddList(List&lt; Address&gt; addList){this.addList = addList; }   

我們有兩個實體Employee和Address with One to Many關係。

  import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name =“address” )public class Address實現Serializable {private static final long serialVersionUID = 1L; private int address_id; 私有字符串地址; 員工員工; @Id @GeneratedValue(strategy = GenerationType.IDENTITY)public int getAddress_id(){return address_id; public void setAddress_id(int address_id){this.address_id = address_id; public String getAddress(){return address; public void setAddress(String address){this.address = address; } @ManyToOne @JoinColumn(name =“emp_id”)public Employee getEmployee(){return employee; public void setEmployee(Employee employee){this.employee = employee; 通過這種方式我們可以實現兩個表之間的內連接 
  import java.util.List;}   

import org.hibernate.Query; 進口組織。hibernate.Session; public class Main {public static void main(String [] args){saveEmployee(); retrieveEmployee(); private static void saveEmployee(){Employee employee = new Employee(); 員工employee1 =新員工(); 員工employee2 =新員工(); 員工employee3 =新員工(); 地址address = new Address(); 地址address1 = new Address(); 地址address2 = new Address(); 地址address3 = new Address(); address.setAddress(“1485,Sector 42 b”); address1.setAddress(“1485,Sector 42 c”); address2.setAddress(“1485,Sector 42 d”); address3.setAddress(“1485,Sector 42a”); employee.setEmpName(“Varun的”); employee1.setEmpName(“克尚”); employee2.setEmpName(“Aasif”); employee3.setEmpName(“ 列表與LT;員工&GT; 列表= query.list(); 。list.stream()的forEach((P) - &GT; {的System.out.println(p.getEmpName());}); session.close(); } catch(Exception e){e.printStackTrace(); }

我使用Java 8 for循環來引用名稱。確保你有tomcat 8的jdk 1.8。還要添加一些記錄以便更好地理解。

  public class HibernateUtil {private static SessionFactory sessionFactory; static {Configuration configuration = new Configuration(); configuration.addAnnotatedClass(Employee.class); configuration.addAnnotatedClass(Address.class); configuration.setProperty(“connection.driver_class”,“com.mysql.jdbc.Driver”); configuration.setProperty(“冬眠。buildSessionFactory(builder.build()); public static SessionFactory getSessionFactory(){return sessionFactory; }}  
     
			
        
0
votes
answers
35 views
+10

刪除連接表的行級聯休眠

0

我想從中間連接表中刪除數據。我越來越刪除連接表的行級聯休眠

更新或刪除表「eoclass」違反了表「eostaff_user_eoclass」 細節外鍵約束「fk_o5mbi65xmqv60x0m5v0l1raf8」:密鑰(primary_key)=(51)仍然從表「eostaff_user_eoclass」引用。

這裏是我的實體

@Entity 
@Table(name = "EOSTAFF_USER") 
@SequenceGenerator(name = "EOSTAFF_USER_SEQ", initialValue = 1, allocationSize = 1, sequenceName = "EOSTAFF_USER_SEQ") 
public class EOStaffUser extends EOObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EOSTAFF_USER_SEQ") 
    @Column(name = "PRIMARY_KEY") 
    public long primaryKey; 

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    public List<EOClass> eoClassArray = new LinkedList<>(); 
} 

@Entity 
@Table(name = "EOCLASS", uniqueConstraints = @UniqueConstraint(columnNames = { "eoinstitute_primary_key", 
    "lkclass_primary_key", "lksection_primary_key", "lksubject_primary_key" })) 

@SequenceGenerator(name = "EOCLASS_SEQ", initialValue = 1, allocationSize = 1, sequenceName = "EOCLASS_SEQ") 

public class EOClass extends EOObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EOCLASS_SEQ") 
    @Column(name = "PRIMARY_KEY") 
    public long primaryKey; 
} 
+1

請首先在數據庫級別檢查通常的嫌疑人。刪除有關記錄/實體是否可以留下任何兒童記錄?將這些東西從清單中刪除,然後再擔心Hibernate。 –

沙发
0
0

你不能簡單地刪除EOClass因爲Hibernate不會刪除連接表的記錄。

對於您的映射,您需要加載EOStaffUser,從eoClassArray刪除EOclass併合並整個EOStaffUser實體。

0
votes
answers
49 views
+10

persistence.xml文件是不是在classpath

-1

所以我試圖建立使用Wildfly,JPA,Hibernate和MariaDB的使用Maven在Eclipse的adminsystem。我在WildFly管理控制檯中配置了我的數據源,一切正常。 Succesful connection picture in WildFly 現在我試圖寫入該項目與實體管理器工廠的數據庫在Eclipse。但我有此錯誤消息: Error message in Eclipse 在這裏你可以看到我的項目樹: Project treepersistence.xml文件是不是在classpath

這裏是我的POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>com.gyurmatag.adminsystem</groupId> 
<artifactId>adminsystem</artifactId> 
<version>1.0</version> 
<packaging>war</packaging> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 

    <servlet.version>3.1.0</servlet.version> 
    <jsf.version>2.2.12</jsf.version> 
    <primefaces.version>5.3</primefaces.version> 

    <version.wildfly>9.0.2.Final</version.wildfly> 
    <jboss.home>${project.build.directory}/wildfly-${version.wildfly} 
    </jboss.home> 
    <server.config>standalone.xml</server.config> 

    <maven-compiler-plugin.version>3.3</maven-compiler-plugin.version> 
    <maven-dependency-plugin>2.10</maven-dependency-plugin> 
    <maven-resources-plugin.version>2.7</maven-resources-plugin.version> 
    <wildfly-maven-plugin.version>1.1.0.Alpha5</wildfly-maven-plugin.version> 
</properties> 

<dependencies> 
    <!-- Servlet --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>${servlet.version}</version> 
     <scope>provided</scope> 
    </dependency> 
    <!-- JSF --> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-api</artifactId> 
     <version>${jsf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.faces</groupId> 
     <artifactId>jsf-impl</artifactId> 
     <version>${jsf.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <!-- PrimeFaces --> 
    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>${primefaces.version}</version> 
    </dependency>  

    <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java- 
client --> 
    <dependency> 
     <groupId>org.mariadb.jdbc</groupId> 
     <artifactId>mariadb-java-client</artifactId> 
     <version>2.2.0</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.2.12.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
    </dependency> 


    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate- 
entitymanager --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.2.12.Final</version> 
    </dependency> 

</dependencies> 

<build> 
<pluginManagement> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>${maven-compiler-plugin.version}</version> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
      </configuration> 
     </plugin> 
     <!-- Unpack the distribution --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <version>${maven-resources-plugin.version}</version> 
      <executions> 
       <execution> 
        <id>unpack-wildfly</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>unpack</goal> 
        </goals> 
        <configuration> 
         <artifactItems> 
          <artifactItem> 
           <groupId>org.wildfly</groupId> 
           <artifactId>wildfly-dist</artifactId> 
           <version>${version.wildfly}</version> 
           <type>zip</type> 
           <overWrite>false</overWrite> 
           <outputDirectory>${project.build.directory} 
</outputDirectory> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <!-- Copy server configuration --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>${maven-resources-plugin.version}</version> 
      <executions> 
       <execution> 
        <id>copy-standalone-xml</id> 
        <phase>generate-sources</phase> 
        <goals> 
         <goal>copy-resources</goal> 
        </goals> 
        <configuration> 

<outputDirectory>${jboss.home}/standalone/configuration</outputDirectory> 
         <resources> 
          <resource> 
           <directory>src/main/resources</directory> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <!-- Maven WildFly plugin --> 
     <plugin> 
      <groupId>org.wildfly.plugins</groupId> 
      <artifactId>wildfly-maven-plugin</artifactId> 
      <version>${wildfly-maven-plugin.version}</version> 
      <configuration> 
       <jbossHome>${jboss.home}</jbossHome> 
       <serverConfig>${server.config}</serverConfig> 
      </configuration> 
     </plugin> 
    </plugins> 
    </pluginManagement> 
</build> 

這裏是我的持久性。 XML:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
     version="2.0"> 

      <persistence-unit name="adminsystem" transaction-type="JTA"> 
      <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

       <jta-data-source>jboss/MariaDBDS</jta-data-source> 


       <properties> 
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
        <property name="hibernate.hbm2ddl.auto" value="validate" /> 
        <property name="hibernate.show_sql" value="true" /> 
        <property name="hibernate.format_sql" value="true" /> 
        <property name="hibernate.connection.release_mode" value="auto" /> 
       </properties> 
      </persistence-unit> 

這裏是我JPAUtility類:

package com.gyurmatag.adminsystem.model; 


import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 


public class JPAUtility { 
private static final EntityManagerFactory emFactory; 
static { 
     emFactory = Persistence.createEntityManagerFactory("adminsystem"); 
} 
public static EntityManager getEntityManager(){ 
    return emFactory.createEntityManager(); 
} 
public static void close(){ 
    emFactory.close(); 
} 
} 

如果你想採取一個更仔細看看我的項目,你可以在這裏找到:Bitbucket repo

你能幫助我有了這個?

非常感謝! :)

+5

'persistence.xml'就是它應該被稱爲... – DN1

+0

這似乎是一個在問題中錯字... –

+0

是的。這是一個錯字。感謝您的答案! –

沙发
0
0

我懷疑你有太常見了「太多的依賴錯誤」。

更換所有你的依賴與:

<dependencies> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.primefaces</groupId> 
     <artifactId>primefaces</artifactId> 
     <version>${primefaces.version}</version> 
    </dependency>  
</dependencies> 

,看你怎麼去...

+0

我的代碼中存在拼寫錯誤。無論如何感謝您的答案! –

+0

您應該解決您的依賴反正 –

+1

它工作正常... –

43
votes
answers
16 views
+10

How to disable hibernate caching

I am trying to write a unit test class which will have to use same query to fetch the results from database two times in same test method. But as Hibernate cache is enabled second time it is not actually hitting the database and simply fetching the results from cache.

Can someone please answer how to disable caching in persistence.xml.

I tried to disable by changing properties hibernate.cache.use.query_cache = false and hibernate.cache.use_second_level_cache = false.

But It did not work.

沙发
+200

有人可以回答如何在persistence.xml中禁用緩存。

默認情況下禁用二級緩存和查詢緩存(除非你禁止查詢,否則不會緩存查詢明確緩存它們)。無法禁用第一級緩存。

我試圖通過更改屬性來禁用(...)

這會禁用二級緩存和查詢緩存,如果< / strong>他們已啟用。

但它沒有用。

老實說,“它沒用”是一個非常糟糕的描述當前行為與預期行為相比。提供更多細節,(偽)代碼,SQL跟踪可能會有所幫助。

話雖如此,如果問題是關於HQL,HQL查詢肯定會在後續執行時命中數據庫(沒有任何查詢緩存)。如果需要,請激活SQL日誌記錄。

如果問題是關於 Session#get() Session#load(),那麼你可以使用 Session#refresh()重新加載實體的狀態,或者調用 Session#clear()來完全清除會話。

對不起,但這沒用。 - Damir Olejar於2017年2月10日15:45

板凳
+90

Hibernate有兩級Cache,

  1. 會話緩存(第一級緩存)是默認緩存,沒有機制可以禁用。 < li>

    SessionFactory(二級)級別緩存:我們必須通過設置cache_provider在Hibernate cfg文件中配置它。

    我需要從DB加載大量數據,我使用因為以下功能,無狀態會話

      a。無狀態會話不支持會話緩存,也從不與二級緩存交互。無狀態會話不支持自動臟檢查。C。無狀態會話不支持級聯到關聯實體。  

    創建無狀態會話的語法: < pre> StatelessSession statelessSession = sessionFactory.openStatelessSession();

entityManager.clear()不清理所謂的第一級緩存嗎? - Derp 9月4日在9:16

地板
+70

您可以在:

會話後使用:

session.setCacheMode(CacheMode.IGNORE)

.createQuery(“from table”)語句。

這將確保Hibernate不會與此查詢返回的任何實體的二級緩存交互。

5楼
+30

如果您在單元測試中創建一個新的(不同的)會話,它將“不”使用舊的緩存。或者如果你先調用clear()(另一個選項),等等。

使用clear()節省了一天。太感謝了! - Damir Olejar於2017年2月10日15:54

6楼
0

來自hibenrate團隊的人員說:

二級緩存與第一級(會話或持久性上下文)緩存無關。由於各種原因,持久性上下文/會話高速緩存是強制性的。事實上,不理解這個關鍵部分並忽略它在應用程序架構中是一個災難的處方。這裡沒有快速解決方案,研究一些文檔。

來源:https://forum.hibernate.org/viewtopic.php?p = 2383408
你可以使用seesion.evict (您的對象)在重試相同的查詢之前。

7楼
0

第一次查詢結果後,調用session.clear然後相同的查詢將命中數據庫而不是1級緩存