代码之家  ›  专栏  ›  技术社区  ›  Daniel Bleisteiner

org.hibernate.envers.event.AuditEventListener.generateBidirectionalCollectionChangeWorkUnits(…)上的NullPointerException

  •  0
  • Daniel Bleisteiner  · 技术社区  · 15 年前

    我正在使用Envers审核实体的不同字段。该框架通常可以工作,但似乎在某些类型的实体映射方面存在问题。以前我能自己解决的所有问题。。。但这次我被卡住了。

    在将某些实体插入数据库时,我遇到以下异常:

    Caused by: java.lang.NullPointerException
        at org.hibernate.envers.event.AuditEventListener.generateBidirectionalCollectionChangeWorkUnits(AuditEventListener.java:108)
    

    我们正在使用一些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来生成变化历史。

    1 回复  |  直到 13 年前
        1
  •  9
  •   Daniel Bleisteiner    15 年前

    我找到了问题的解决办法。所以我会把它分享给其他人。

    对ExtendedEntity的引用导致了问题。ExtendedEntity是一个具有不同子类的已审核类。但是Envers不会自动将子类标记为已审核。子类必须使用@Audited注释作为类或要由Envers审核的任何自己的字段。