我们正在使用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来关闭不需要的反射优化
让我们知道这是否有帮助