@PrePersist mit entity-Vererbung
Ich habe einige Probleme mit der Vererbung und der @PrePersist annotation.
Mein Quellcode sieht wie folgt aus:
_die "Basis" - Klasse mit den kommentierten updateDates () - Methode:
@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Base implements Serializable{
...
@Id
@GeneratedValue
protected Long id;
...
@Column(nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date creationDate;
@Column(nullable=false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastModificationDate;
...
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Date getLastModificationDate() {
return lastModificationDate;
}
public void setLastModificationDate(Date lastModificationDate) {
this.lastModificationDate = lastModificationDate;
}
...
@PrePersist
protected void updateDates() {
if (creationDate == null) {
creationDate = new Date();
}
lastModificationDate = new Date();
}
}
_ jetzt ist das "Kind" - Klasse, die erbt alle Methoden "und " Anmerkungen" von der Basis-Klasse:
@javax.persistence.Entity
@NamedQueries({
@NamedQuery(name=Sensor.QUERY_FIND_ALL, query="SELECT s FROM Sensor s")
})
public class Sensor extends Entity {
...
//additional attributes
@Column(nullable=false)
protected String value;
...
//additional getters, setters
...
}
Wenn ich speichern/anhalten von Instanzen der Basis-Klasse auf die Datenbank, funktioniert alles einwandfrei. Die Termine werden immer aktualisiert.
Aber jetzt, wenn ich will, um fortbestehen einer Kind-Instanz, die Datenbank wirft folgenden Ausnahme:
MySQLIntegrityConstraintViolationException: Column 'CREATIONDATE' cannot be null
So, in meiner Meinung, dies wird verursacht, weil im Kind die Methode "@PrePersist protected void updateDates()" nicht aufgerufen wird,/wird aufgerufen, bevor anhaltenden die Instanzen in der Datenbank.
Was ist falsch an meinem code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Getestet hab ich den code mit Hibernate als JPA-provider (und HSQLDB). Ich habe gerade die folgende änderung in der Basisklasse (weil Sie nicht verwenden können
IDENTIY
- die Standardeinstellung mit HSQLDB und auch mit MySQL wenn ich mich nicht falsch - mit einemTABLE_PER_CLASS
Strategie1):Mit dieser änderung, die folgende test-Methode übergibt:
Also die
@PrePersist
annotierte Methode wird aufgerufen, in der geerbten Klasse.Damit stellt sich die Frage: welche JPA-provider verwenden Sie?
1 siehe dieser thread Hintergrundinformationen.