Frage

Ich benutze Envers, um verschiedene Felder meiner Entitäten zu prüfen. Der Rahmen funktioniert im Allgemeinen, aber es scheint Probleme mit einigen Arten von Entitätskartierungen zu haben. Alle früheren Probleme, die ich selbst lösen konnte ... aber diesmal stecke ich fest.

Wenn ich eine Entität in die Datenbank einfügte, erhalte ich die folgende Ausnahme:

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

Ich bin mir nicht ganz sicher, welches Entität dies verursacht, da sie während des Flush () abgefeuert wird und die komplexe Anwendung viele verschiedene Entitäten innerhalb einer größeren Transaktion einfügt.

Wir verwenden einige HibernateEventListener, die kurz vor dieser Ausnahme feuert ... Ich nehme an, dass diese Entität die Ursache ist. Die Persistenz.xml ist auf diese Weise konfiguriert:

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

Wenn dies wahr ist als die Entität der folgende (Auszug):

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

} 

Hat jemand eine Idee, nach der er suchen kann? Sobald wir Envers deaktivieren, funktioniert alles einwandfrei. Aber wir brauchen Envers, um eine Geschichte von Veränderungen zu erzeugen.

War es hilfreich?

Lösung

Ich fand die Lösung meines Problems. Also werde ich es für andere teilen.

Der Hinweis auf die Verlängerung verursachte das Problem. Extendentity ist eine geprüfte Klasse mit unterschiedlichen Unterklassen. Aber Envers markiert die Unterklasse nicht automatisch als geprüft. Die Unterklasse muss die @Audited Annotation für die Klasse oder alle eigenen Felder verwenden, um durch Envers geprüft zu werden.

Ein Hinweis auf eine Untermauer von Extendentität, die geprüft wurde, funktionierte. In meinem Fall habe ich auf eine andere Unterklasse verwiesen, die von Envers nicht geprüft wurde - und so wurde die NullPointerexception geworfen. Durch einfaches Hinzufügen der @genannten Annotation zu dieser leeren Erweiterung der Extendentity -Klasse (keine eigenen Eigenschaften ... nur eine Unterklasse, um eine andere Art von Entität zu unterscheiden) und die Erstellung der zugehörigen Versionstabelle in der Datenbank zu erstellen, könnte ich diese Lücke schließen und meine lösen Problem.

Denken Sie daran, Unterklassen mit @Audited auf einem eigenen Bereich oder der Klasse selbst zu markieren - ansonsten werden sie nicht geprüft und Sie könnten genau das gleiche Problem stoßen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top