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

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

Question

J'utilise pour vérifier différents Envers les champs de mes entités. Le cadre fonctionne en général, mais il semble avoir des problèmes avec certains types de cartographie de l'entité. Tous les anciens problèmes que je pouvais me résoudre ... mais cette fois je suis coincé.

Lors de l'insertion une entité dans la base de données que je reçois l'exception suivante:

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

Je ne suis pas sûr entité completly cause parce qu'il est tiré lors du flush () et l'application complexe insère de nombreuses entités différentes au sein d'une transaction plus importante.

Nous utilisons certains HibernateEventListener que les feux juste avant cette exception ... donc je suppose que cette entité est la cause. Le persistence.xml est configuré de cette façon:

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

Si cela est vrai que l'entité est le (extrait) suivant:

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

} 

Est-ce que quelqu'un a une idée où chercher? Dès que nous désactivons tout Envers fonctionne très bien. Mais nous avons besoin pour générer un Envers historique des modifications.

Était-ce utile?

La solution

J'ai trouvé la solution de mon problème. Je vais le partager pour les autres.

La référence au ExtendedEntity a causé le problème. ExtendedEntity est une classe vérifiée avec des sous-classes différentes. Mais ne marque pas Envers automatiquement la sous-classe audités. La sous-classe doit utiliser l'annotation @Audited pour la classe ou des propres champs à auditer par Envers.

Ainsi, une référence à une sublass de ExtendedEntity, qui a été audité, travaillé. Dans mon cas, je l'ai référencé autre sous-classe qui n'a pas été audité par Envers - et donc le NullPointerException a été jeté. En ajoutant simplement l'annotation @Audited à cette extension vide de la classe ExtendedEntity (pas propres propriétés ... juste une sous-classe de distinguer un autre type d'entité) et la création de la table de versionnage associée dans la base de données que je pourrais combler ce fossé et résoudre mon problème.

Rappelez-vous pour marquer avec les sous-classes @Audited à tout propre terrain ou la classe elle-même -. Sinon, ils ne sont pas vérifiés et vous pourriez rencontrer le même problème

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top