Hibernate Envers和"Javassist Enhancement failed"异常

Mat*_*teo 13 hibernate hibernate-envers

我们正在使用Hibernate Envers并出现以下情况:

一个类BusinessObjectTypeIdentity一个引用的类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;

    […]

}
Run Code Online (Sandbox Code Playgroud)

然后我们查询所有版本的Identity:

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

@SuppressWarnings( "unchecked" )
List< Object[]> history = (List< Object[]>) auditQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)

如果存储的身份没有BusinessObjectType(即,businessObjectType是和否),一切都像魅力一样.

如果身份有一个businessObjectType != null我们得到"Javassist Enhancement failed"异常:

Javassist Enhancement failed: ch.ethz.id.wai.baseclasses.BusinessObjectType
Run Code Online (Sandbox Code Playgroud)

这个错误似乎与Envers试图实例化一个BusinessObjectType有关但我真的没看到问题是什么(如果我们不使用AuditQuery,Hibernate对这两个对象都没有问题).

异常的原因是

java.lang.InstantiationException: ch.ethz.id.wai.baseclasses.BusinessObjectType_$$_javassist_49
Run Code Online (Sandbox Code Playgroud)

没有堆栈跟踪.

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

Man*_*ngh 20

这发生在以下类JavassistLazyInitializer内部 基于Javassist的惰性初始化代理.

如果没有查看完整的来源,很难发表评论,但您可以尝试以下选项.

  • 关闭@ManyToOne关系的延迟加载[ 这是一个设计决定,因此请注意它是否不适合整体解决方案 ]
  • 为您的实体提供一个默认的公共构造函数,这会导致问题[这更容易]
  • 如果不是真的需要将hibernate.bytecode.use_reflection_optimizer属性设置为false,则关闭反射优化

如果这有帮助,请告诉我们