JPA entity default-Wert
Habe ich eine Entität mit default-Wert und ein berechnetes Feld wie folgt:
public class Target{
@Transient
public Long total;
@Min(0)
@Column(columnDefinition="default 0")
public Long val1 = 0L;
@Min(0)
@Column(columnDefinition="default 0")
public Long val2 = 0L;
public Target() {
this.total = Long.valueOf(0L);
this.val1 = Long.valueOf(0L);
this.val2 = Long.valueOf(0L);
}
public Long calcTotal() {
return val1 + val2 ;
}
public void setVal1(Long val) {
this.val1 = checkNotNull(val);
total = calcTotal();
}
public void setVal2(Long val) {
this.val2 = checkNotNull(val);
total = calcTotal();
}
}
Jedoch, wenn die Einheit geladen wird, indem JPA, der setter aufgerufen werden und eine NullPointerException geworfen wird, in calc.
Ist es irgendwie Standard, die Werte vor dem JPA ruft die setter?
InformationsquelleAutor emt14 | 2012-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst, Ihre Zuordnung, die JPA Motor sollte nicht der Aufruf der Set-Methoden, da Sie wählte Feld zugreifen, indem Sie die Anmerkungen auf dem Feld.
Zweite, es gibt keine
total
Feld im code.Dritten, sollte dieses Feld nicht vorhanden, denn es kann berechnet werden aus zwei anderen Feldern. Lass die anderen Klassen rufen
calcTotal()
um Zugriff auf dessen Wert. Und benennen Sie diese MethodegetTotal()
.Oh, und die Felder werden sollte privat, nicht öffentlich.
Wenn Sie wirklich wollen, speichern Sie das Ergebnis für die Wiederverwendung, dann berechnen Sie träge, und setzen Sie ihn auf null, wenn einer der Operanden geändert:
Es sei denn, Spiel komplett ändert sich der code der Einheit, meine Punkte bleiben noch offen: der setter sollte nicht aufgerufen werden, in den ersten Platz. Und die Art und Weise Sie haben Karten insgesamt, es ist persistent in der Datenbank, die gar nicht notwendig ist. Und die Kosten für die Ergänzung, ist lächerlich und vernachlässigbar im Vergleich zu den Kosten für das laden der Entität aus der Datenbank. Computing es an jedem Zugang kein signifikanter Unterschied.
Guter Ausgangspunkt um die Beharrlichkeit, mit der die Summe, ich werde es vorübergehend. Aber dies ist ein Vereinfachtes Beispiel und in meinem speziellen Fall ist das sinnvoll.
Dann wieder den Wert der
total
wenn nicht null, wenn getTotal() aufgerufen wird, berechnen und speichern das Ergebnis intotal
wenn getTotal() wird aufgerufen, wenntotal
null ist, und setzen Sietotal
auf null, jedes mal, wenn ein setter auf einer der Operanden aufgerufen wird. Siehe meine aktualisierte Antwort.Ich werde die Antwort akzeptieren, wie kann ich das problem umgehen. Aber ich bin mir noch nicht sicher, warum die Felder nicht initialisiert werden, bevor die Set-Methoden aufgerufen werden. Ich glaube, ich muss Graben ins Spiel, die Magie der tricks.
InformationsquelleAutor JB Nizet