FieldHandler和@Cache在升级到hibernate 5后导致错误

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.

我正在尝试从Wildfly 9升级到10,这也将hibernate从4.3升级到5

我的查询已经运行了一年多,没有任何问题,但其中一些在升级后会抛出错误。我阅读了迁移指南,但我没有发现可能发生了什么变化,甚至没有发现它是否是一个bug

第一期

第一个问题与@Cache(usage=cacheconcurrentystrategy.TRANSACTIONAL)在我的一个实体中的使用有关

使用它,我开始出现如下错误:

[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
}