FieldHandler和@Cache在升级到hibernate 5后导致错误
我正在尝试从Wildfly 9升级到10,这也将hibernate从4.3升级到5 我的查询已经运行了一年多,没有任何问题,但其中一些在升级后会抛出错误。我阅读了迁移指南,但我没有发现可能发生了什么变化,甚至没有发现它是否是一个bug 第一期 第一个问题与@Cache(usage=cacheconcurrentystrategy.TRANSACTIONAL)在我的一个实体中的使用有关 使用它,我开始出现如下错误:FieldHandler和@Cache在升级到hibernate 5后导致错误,hibernate,jpa,Hibernate,Jpa,我正在尝试从Wildfly 9升级到10,这也将hibernate从4.3升级到5 我的查询已经运行了一年多,没有任何问题,但其中一些在升级后会抛出错误。我阅读了迁移指南,但我没有发现可能发生了什么变化,甚至没有发现它是否是一个bug 第一期 第一个问题与@Cache(usage=cacheconcurrentystrategy.TRANSACTIONAL)在我的一个实体中的使用有关 使用它,我开始出现如下错误: [Server:server-one] Caused by: java.lang.
[Server:server-one] Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Short field br.uel.acad.database.cae.model.CalendarioEscolarPK.anoLetivo to br.uel.acad.database.cae.model.CalendarioEscolarPK
[Server:server-one] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
[Server:server-one] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
[Server:server-one] at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
[Server:server-one] at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
[Server:server-one] at java.lang.reflect.Field.get(Field.java:393)
[Server:server-one] at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39)
[Server:server-one] ... 191 more
由于某些原因,它无法设置复合主键的字段。这是我的实体的简化表示:
@Entity
@Table(name = "CALENDARIO_ESCOLAR")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class CalendarioEscolar implements Serializable {
@EmbeddedId
protected CalendarioEscolarPK id;
//other fields, getters and setters
}
@Embeddable
public class CalendarioEscolarPK implements Serializable {
@Basic(optional = false)
@NotNull
@Column(name = "ANO_LETIVO")
private Short anoLetivo;
//other fields, getters and setters
}
搜索方法:
public CalendarioEscolar buscarProximoEventoNaoIniciado(CalendarioEscolar.Evento evento) {
List<CalendarioEscolar> eventos = em.unwrap(Session.class).createCriteria(CalendarioEscolar.class)
.add(Restrictions.eq("id.tipEvento", evento.getCodigo()))
.add(Restrictions.gt("datInicio", new Date()))
.addOrder(Order.asc("datInicio"))
.addOrder(Order.asc("id.semestreLetivo"))
.list();
if (CollectionUtils.isNotEmpty(eventos)) {
return eventos.get(0);
} else {
return null;
}
}
使用hibernate 5,该属性始终返回null。我发现如果我从实体的一个字段中删除fieldHandler,它会再次工作
@Entity
@Table(name = "DADOS_ACADEMICOS", schema = "CAE")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class DadosAcademicos implements Serializable, FieldHandled {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "dadosAcademicos", fetch = FetchType.LAZY)
private Set<HabilitacaoAluno> habilitacoesAluno;
@LazyToOne(LazyToOneOption.NO_PROXY)
@JoinColumn(name = "NUM_MATRICULA", referencedColumnName = "NUM_MATRICULA", insertable = false, updatable = false)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private DevedorBiblioteca devedorBiblioteca;
private FieldHandler fieldHandler;
public DevedorBiblioteca getDevedorBiblioteca() {
if (fieldHandler != null) {
return (DevedorBiblioteca) fieldHandler.readObject(this, "devedorBiblioteca", devedorBiblioteca);
}
return devedorBiblioteca;
}
public void setDevedorBiblioteca(DevedorBiblioteca devedorBiblioteca) {
if (fieldHandler != null) {
this.devedorBiblioteca = (DevedorBiblioteca) fieldHandler.writeObject(this, "devedorBiblioteca", this.devedorBiblioteca, devedorBiblioteca);
}
this.devedorBiblioteca = devedorBiblioteca;
}
@Override
public void setFieldHandler(FieldHandler fh) {
this.fieldHandler = fh;
}
@Override
public FieldHandler getFieldHandler() {
return fieldHandler;
}
//other fields, getters and setters
}
@实体
@表(name=“DADOS\u ACADEMICOS”,schema=“CAE”)
@缓存(用法=CacheConcurrencyStrategy.TRANSACTIONAL)
公共类DadosAcademicos实现了可序列化、字段处理{
@OneToMany(cascade=CascadeType.ALL,mappedBy=“dadosAcademicos”,fetch=FetchType.LAZY)
私人设置能力训练;
@LazyToOne(LazyToOneOption.无代理)
@JoinColumn(name=“NUM\u MATRICULA”,referencedColumnName=“NUM\u MATRICULA”,insertable=false,updateable=false)
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
私人DevedorBiblioteca DevedorBiblioteca;
私有字段处理程序字段处理程序;
公共DevedorBiblioteca getDevedorBiblioteca(){
if(fieldHandler!=null){
return(DevedorBiblioteca)fieldHandler.readObject(这是“DevedorBiblioteca”,DevedorBiblioteca);
}
返回德维多罗特卡;
}
公共无效设置DevedorBiblioteca(DevedorBiblioteca DevedorBiblioteca){
if(fieldHandler!=null){
this.devedorBiblioteca=(devedorBiblioteca)fieldHandler.writeObject(this,“devedorBiblioteca”,this.devedorBiblioteca,devedorBiblioteca);
}
this.devedorBiblioteca=devedorBiblioteca;
}
@凌驾
公共无效setFieldHandler(FieldHandler fh){
this.fieldHandler=fh;
}
@凌驾
公共FieldHandler getFieldHandler(){
返回字段处理程序;
}
//其他字段、getter和setter
}
如果我移除fieldHandler,它会再次工作。我知道Hibernate5对字节码插装进行了一些更改,但我不知道会有什么变化
有人知道为什么会发生这些问题吗?这很可能是由于在内存中缓存的元素数量超过某个值且启用了
maxElementsInMemory
和overflowToDisk
时,从Hibernate的二级缓存中读取导致的错误。我在迁移期间也遇到了同样的问题
有关详细信息,请参阅引发的错误当内存中缓存的元素数超过某个值且启用了
maxElementsInMemory
且overflowToDisk
时,很可能是从Hibernate的二级缓存读取导致的错误。我在迁移期间也遇到了同样的问题
有关更多信息,请参阅引发的错误
@Entity
@Table(name = "DADOS_ACADEMICOS", schema = "CAE")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class DadosAcademicos implements Serializable, FieldHandled {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "dadosAcademicos", fetch = FetchType.LAZY)
private Set<HabilitacaoAluno> habilitacoesAluno;
@LazyToOne(LazyToOneOption.NO_PROXY)
@JoinColumn(name = "NUM_MATRICULA", referencedColumnName = "NUM_MATRICULA", insertable = false, updatable = false)
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private DevedorBiblioteca devedorBiblioteca;
private FieldHandler fieldHandler;
public DevedorBiblioteca getDevedorBiblioteca() {
if (fieldHandler != null) {
return (DevedorBiblioteca) fieldHandler.readObject(this, "devedorBiblioteca", devedorBiblioteca);
}
return devedorBiblioteca;
}
public void setDevedorBiblioteca(DevedorBiblioteca devedorBiblioteca) {
if (fieldHandler != null) {
this.devedorBiblioteca = (DevedorBiblioteca) fieldHandler.writeObject(this, "devedorBiblioteca", this.devedorBiblioteca, devedorBiblioteca);
}
this.devedorBiblioteca = devedorBiblioteca;
}
@Override
public void setFieldHandler(FieldHandler fh) {
this.fieldHandler = fh;
}
@Override
public FieldHandler getFieldHandler() {
return fieldHandler;
}
//other fields, getters and setters
}