NullPointerException a org.hibernate.envers.event.AuditEventListener.generateBidirectionalCollectionChangeWorkUnits (...)

StackOverflow https://stackoverflow.com/questions/1764048

Domanda

sto usando Envers per controllare diversi campi dei miei soggetti. Il quadro funziona in generale, ma sembra avere problemi con alcuni tipi di mappatura entità. Tutti gli ex problemi che potrebbero risolvere me stesso ... ma questa volta mi sono bloccato.

Quando si inserisce una qualche entità nel database ottengo la seguente eccezione:

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

Non sono completamente sicuro di quale entità causa questo perché è sparato durante il flush () e il complesso applicazione inserisce molte entità diverse all'interno di una transazione più grande.

Stiamo usando un po 'di HibernateEventListener che gli incendi a destra prima di tale eccezione ... quindi suppongo che entità è la causa. Il persistence.xml è configurato in questo modo:

        <property name="hibernate.ejb.event.post-insert" value="com.xyz.hibernate.events.listeners.MyListener,org.hibernate.envers.event.AuditEventListener" />

Se questo è vero che l'entità è il seguente (estratto):

@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!

} 

Qualcuno ha un'idea di dove cercare? Non appena abbiamo disabilitato Envers tutto funziona bene. Ma abbiamo bisogno envers per generare una cronologia delle modifiche.

È stato utile?

Soluzione

Ho trovato la soluzione del mio problema. Quindi io condividere per gli altri.

Il riferimento al ExtendedEntity ha causato il problema. ExtendedEntity è una classe controllato con diverse sottoclassi. Ma Envers non segna automaticamente la sottoclasse come oggetto di revisione contabile. La sottoclasse deve usare l'annotazione @Audited per la classe o qualsiasi propri campi deve essere verificata da Envers.

Quindi, un riferimento a qualsiasi sublass di ExtendedEntity, che è stato controllato, ha funzionato. Nel mio caso ho fatto riferimento un'altra sottoclasse che non è stata verificata da Envers - e così il NullPointerException è stato gettato. Con la semplice aggiunta l'annotazione @Audited a quella estensione vuota della classe ExtendedEntity (Nessuna propria proprietà ... solo una sottoclasse di distinguere un altro tipo di entità) e la creazione del relativo tavolo delle versioni del database potevo chiudere questa lacuna e risolvere il mio problema.

Ricordati di marcare sottoclassi con @Audited in qualsiasi campo proprio o della classe stessa -. Altrimenti non siano controllati e si potrebbe venire attraverso lo stesso identico problema

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top