Hibernate + Ehcache - 发生IllegalArgumentException调用合成ID的getter
问题描述:
在这里搜索了很多,没有发现任何类似的情况,对不起,如果我错了。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
...
}
我证实,当休眠尝试这个错误发生(做测试)从缓存中保存实体。如果我关闭缓存它的作品。
所以当回滚的版本,它的作品再次启用缓存。
它的发生与我的所有实体具有组合键,并在二级缓存
答
你必须调试和检查,为什么水化过程中的Hibernate抛出ClassCastException
。这可能是一些错误。
但是,我也注意到了你的映射中的怪异。为什么@EmbeddedId
属性和@ManyToOne
@JoinColumn
都设置为insertable = false
和updatable = false
。
这将使它无法坚持和Employee
或更改其Company
。
正如我在this article中所解释的,@EmbeddedId
应插入并更新组合标识符,而@ManyToOne
应使用@MapsId
。
我已经使用@MapsId查看了你说的映射,但该错误仍然存在(只是提及)。 但是,作为证明,我将注释从“get”方法更改为属性。 的误差变化,现在是: ' “错误由持久性属性ID反射访问字段私人:[Ljava.lang.Object; @ 715ef487”> “' '” 产生的原因:java.lang.IllegalArgumentException异常:无法设置...域ID为[Ljava.lang.Object;“' 你有没有看到 https://hibernate.atlassian.net/browse/HHH-10618 –
我不知道?如果你可以使用[我们的模板]复制它(http://in.relation.to/2016/01/14/hibernate-jpa-test-case-template/),你应该打开一个问题。 –