我们正在使用Hibernate Envers,并且有以下情况:

BusinessObjectType和类Identity并引用了BusinessObjectType

@Entity
@Table( name = "ID_IDENTITY" )
@Audited
public class Identity {

    @ManyToOne
    @JoinColumn( name = "BO_TYPE_ID" )
    @IndexColumn( name = "INDEX_BO_BO_TYPE" )
    private BusinessObjectType businessObjectType;

    […]

}


然后,我们使用以下命令查询身份的所有版本:

AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(
    Identity.class,
    false,
    true );
auditQuery.add( AuditEntity.id().eq( dbid ) );

@SuppressWarnings( "unchecked" )
List< Object[]> history = (List< Object[]>) auditQuery.getResultList();


如果存储的标识没有BusinessObjectType(即businessObjectType是且为空),则所有内容都像一个超级字符。

如果身份具有businessObjectType != null,则会收到“ Javassist增强失败”异常:

Javassist Enhancement failed: ch.ethz.id.wai.baseclasses.BusinessObjectType


该错误似乎与Envers试图实例化BusinessObjectType有关,但我并没有真正看到问题所在(如果我们不使用AuditQuery,Hibernate的两个对象都不会出现问题)。

导致异常的原因是

java.lang.InstantiationException: ch.ethz.id.wai.baseclasses.BusinessObjectType_$$_javassist_49


没有堆栈跟踪。

关于可能是什么问题的任何提示?

最佳答案

这发生在以下类JavassistLazyInitializer中,这是一个基于Javassist的惰性初始化程序代理。

如果不看完整的源代码,很难评论,但是您可以尝试以下选项。


为@ManyToOne关系关闭延迟加载[这是一项设计决策,因此请注意是否不适合整体解决方案]
为您的实体提供默认的公共构造函数,这会引起问题[这更容易]
通过将hibernate.bytecode.use_reflection_optimizer属性设置为false来关闭不需要的反射优化


让我们知道这是否有帮助

09-26 12:46