我正在使用 Envers 来审核我的实体的不同字段。该框架通常可以工作,但似乎在某些实体映射方面存在问题。所有以前的问题我都可以自己解决……但这一次我被困住了。
将某些实体插入数据库时,出现以下异常:
Caused by: java.lang.NullPointerException
at org.hibernate.envers.event.AuditEventListener.generateBidirectionalCollectionChangeWorkUnits(AuditEventListener.java:108)
我不能完全确定是哪个实体导致了这种情况,因为它是在 flush() 期间触发的,并且复杂的应用程序在一个更大的事务中插入了许多不同的实体。
我们正在使用一些在该异常之前触发的 HibernateEventListener ......所以我认为该实体是原因。persistence.xml 是这样配置的:
<property name="hibernate.ejb.event.post-insert" value="com.xyz.hibernate.events.listeners.MyListener,org.hibernate.envers.event.AuditEventListener" />
如果这是真的,那么实体如下(摘录):
@Entity
@Table(name = Property.TABLE_NAME, uniqueConstraints = @UniqueConstraint(columnNames = { "ENTITY_ID", "DESCRIPTOR_ID", "PROMOLEVEL_ID" }))
public class Property extends AbstractEntity {
private static final long serialVersionUID = 1L;
public static final String TABLE_NAME = "E_BUSINESS_PROPERTIES";
public static final String PROPERTY_ENTITY = "entity";
public static final String PROPERTY_DESCRIPTOR = "descriptor";
public static final String PROPERTY_PROMOLEVEL = "promolevel";
@Audited
@ManyToOne(optional = false)
private ProjectPropertyDescriptor descriptor;
@Audited
@ManyToOne
private ExtendedEntity entity;
@Audited
@ManyToOne
private AbstractPromotionLevel promolevel;
@Audited
@OneToMany(cascade = { CascadeType.ALL }, mappedBy = PropertyValue.PROPERTY_PROPERTY)
private List<PropertyValue> propertyValues = new ArrayList<PropertyValue>();
// some accessors stripped!
}
有谁知道在哪里寻找?一旦我们禁用 Envers,一切正常。但是我们需要envers来生成变化的历史。