Obwohl Eclipselink und Hibernate nicht intuitiv und offensichtlich nicht vom JPA-Standard gefordert werden, gehen sie sehr weit, um die folgende Quelle von NullPointerExceptions zu erstellen: Wenn alle Felder eines in eine Entität eingebetteten Objekts null sind, ersetzen sie das Feld selbst durch null . Hier ist ein vereinfachtes Beispiel:Wie kann ich verhindern, dass JPA ein einbettbares Objekt auf null setzt, nur weil alle Felder null sind?
@Embeddable
public class Period {
private Date start;
public Date getStart() {
return start;
}
private Date end;
public Date getEnd() {
return end;
}
public boolean equals(Period other) { // TODO: implement hashCode()!
return Objects.equals(start, other.start) && Objects.equals(end, other.end);
}
}
@Entity
public class PeriodOwner {
@Embedded @AttributeOverrides({...})
private Period period;
public Period getPeriod() {
return period;
}
}
Die Idee ist, dass wir die Dinge wie po1.getPeriod().equals(po2.getPeriod())
schreiben kann. Dafür zahlen wir beim indirekten Zugriff auf die Felder Date
direkt: po1.getPeriod().getStart()
. Dies ist oft ein guter Kompromiss, aber nicht, wenn wir stattdessen po1.getPeriod() == null ? null : po1.getPeriod().getStart()
schreiben müssen, weil unser JPA-Provider Null liebt.
Wie können wir sicherstellen, getPeriod()
gibt nie Null zurück? Leider gibt es in der Standard-JPA weder Java-Anmerkungen noch XML-Einstellungen, um dieses Problem entweder global oder für bestimmte Einbettungen oder eingebettete Dateien zu lösen.
AFAIK, wenn Sie synchronisieren rund um den Zugriff auf eine Variable benötigen Sie nicht volatile. https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – narduk
Danke. Ich habe "flüchtig" entfernt, da es unnötig erscheint. –