JPA Best Practice: Statische Lookup-Entitäten
Vorstellen, eine Veranstaltung - entity-Referenzen eine Status Person:
@Entity
@Table(name = "event")
public class Event()
{
@Id
@Column(name = "id", nullable = false)
private long id;
...
@ManyToOne
@JoinColumn(name = "status_code", nullable = false)
private Status status;
}
@Entity
@Table(name = "status")
public class Status()
{
@Id
@Column(name = "code", nullable = false)
private String code;
@Column(name = "label", nullable = false, updatable = false)
private String label;
}
Status zugeordnet ist eine kleine Tabelle 'status
'. Status ist eine typische Referenz /Daten-lookup-Einheit.
code label
----- --------------
CRD Created
ITD Initiated
PSD Paused
CCD Cancelled
ABD Aborted
Ich bin mir nicht sicher, ob es eine gute Idee, Modell Status als eine Einheit. Es fühlt sich eher wie eine Aufzählung von Konstanten,...
Durch die Zuordnung Status als eine Einheit, die ich verwenden kann, Status-Objekte in Java-code, und die Status-Werte sind ebenso in der Datenbank vorhanden. Das ist gut für die Berichterstattung.
Auf der anderen Seite, wenn ich will, um einen bestimmten Status zu einem Event, das kann ich nicht einfach zuweisen, das ständige status habe ich im Hinterkopf. Ich Suche die richtige Person zuerst:
event.setStatus(entityManager.find(Status.class, "CRD"))
Kann ich vermeiden, dass der obige code-fragment? Ich bin affraid, die für eine performance-penalty und es sieht sehr schwer...
- Tun, ich habe alles perfekt mit nur-lese-Attribute?
- Kann ich die prefetch diese lookup-Entitäten und verwenden Sie als Konstanten?
- Fehlte mir eine entscheidende PPV-Funktion?
- ...?
Alle Meinungen /Anregungen /Empfehlungen sind willkommen!
Danke!
J.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, man könnte eine
enum
statt. Ich weiß nicht wirklich sehen, warum Sie eigentlich nicht.Aber wenn Sie wirklich wollen, verwenden Sie ein Unternehmen, dann wäre es ein perfekter Kandidat für 2nd-level-caching und diese lösen würde Ihr Leistung Anliegen.
Created
,Initiated
etc in den enum, nicht den code. Trotzdem, es ist in der Tat vielleicht besser für Sie zu verwenden, eine Entität. Und in diesem Fall, @Jörn Beratung ist gut. Dennoch ist dieses nur-lese-Einheit wäre ein perfekter Kandidat für den L2-Cache. In Bezug auf die überwachung, es kommt auf die L2-cache-provider.Könnten Sie
entityManager.getReference(Status.class, "CRD")
, die möglicherweise nicht Holen die entity aus der Datenbank, wenn es nur verwendet, um einen fremden Schlüssel.