2017-09-01 53 views
2

在這裏搜索了很多,沒有發現任何類似的情況,對不起,如果我錯了。Hibernate + Ehcache - 發生IllegalArgumentException調用合成ID的getter

我的上下文是一個使用Hibernate和二級緩存的系統。

以前使用這些版本(生產與二級緩存使工作超過一年以上):

  • hibernate-ehcache-5.0.9.Final
  • 的Ehcache核-2.4。 3
  • ehcache的-2.9.0
  • hibernate-core-5.0.9.Final
  • 個其他...

現在,升級系統,我們改變了版本:

  • hibernate-ehcache-5.2.10.Final
  • 的Ehcache-2.10.3
  • 休眠-core-5.2.10.Final
  • 其他...

更新Hibernate和EHCA的版本後車開始得到此異常上面:

<exception name="IllegalArgumentException occurred calling getter of br.com.mycompany.myproject.mypackage.Employee.id"> 
    org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of br.com.mycompany.myproject.mypackage.Employee.id 
    at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:64) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4720) 
    at org.hibernate.type.EntityType.toLoggableString(EntityType.java:519) 
    at org.hibernate.type.TypeHelper.toLoggableString(TypeHelper.java:439) 
    at org.hibernate.cache.spi.entry.StructuredCacheEntry.destructure(StructuredCacheEntry.java:54) 
    at org.hibernate.event.internal.DefaultLoadEventListener.processCachedEntry(DefaultLoadEventListener.java:612) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:602) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:462) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:116) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1230) 
    at org.hibernate.internal.SessionImpl.immediateLoad(SessionImpl.java:1088) 
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:259) 
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73) 
    at br.com.mycompany.myproject.mypackage.Employee$$_jvstdd0_3.isActive(Employee_$$_jvstdd0_3.java) 
    at br.com.mycompany.myproject.mypackage.Test.do(Test.java:30) 
    at org.jpos.transaction.TxnSupport.prepare(TxnSupport.java:44) 
    at org.jpos.transaction.TransactionManager.prepare(TransactionManager.java:549) 
    at org.jpos.transaction.TransactionManager.prepare(TransactionManager.java:615) 
    at org.jpos.transaction.TransactionManager.run(TransactionManager.java:291) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.IllegalArgumentException: [email protected] 
    at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:41) 
    ... 23 more 
</exception> 

我的模型實體(創建舉例):

@Entity 
@Table(name = "employee") 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = "myregion") 
public class Employee implements Serializable { 

    private static final long serialVersionUID = 8467432396096896736L; 

    @EmbeddedId 
    private EmployeeID id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_company", nullable = false, insertable = false, updatable = false) 
    private Company company; 

    gets & sets 
    equals & hashcode 
    ... 
} 
@Embeddable 
public class EmployeeID implements Serializable { 

    private static final long serialVersionUID = 8467432396096896736L; 

    @Column(name = "id_employee", nullable = false, insertable = false, updatable = false) 
    private Long idEmployee; 

    @Column(name = "id_company", nullable = false, insertable = false, updatable = false) 
    private Integer idCompany; 

    gets & sets 
    equals & hashcode 
    ... 
} 

我證實,當休眠嘗試這個錯誤發生(做測試)從緩存中保存實體。如果我關閉緩存它的作品。

所以當回滾的版本,它的作品再次啓用緩存。

它的發生與我的所有實體具有組合鍵,並在二級緩存

回答

0

你必須調試和檢查,爲什麼水化過程中的Hibernate拋出ClassCastException。這可能是一些錯誤。

但是,我也注意到了你的映射中的怪異。爲什麼@EmbeddedId屬性和@ManyToOne@JoinColumn都設置爲insertable = falseupdatable = false

這將使它無法堅持和Employee或更改其Company

正如我在this article中所解釋的,@EmbeddedId應插入並更新組合標識符,而@ManyToOne應使用@MapsId

+0

我已經使用@MapsId查看了你說的映射,但該錯誤仍然存​​在(只是提及)。 但是,作爲證明,我將註釋從「get」方法更改爲屬性。 的誤差變化,現在是: ' 「錯誤由持久性屬性ID反射訪問字段私人:[Ljava.lang.Object; @ 715ef487」> 「' '」 產生的原因:java.lang.IllegalArgumentException異常:無法設置...域ID爲[Ljava.lang.Object;「' 你有沒有看到 https://hibernate.atlassian.net/browse/HHH-10618 –

+0

我不知道?如果你可以使用[我們的模板]複製它(http://in.relation.to/2016/01/14/hibernate-jpa-test-case-template/),你應該打開一個問題。 –

相關問題