2016-04-18 5 views
1

Zum Beispiel kann sagen, ich den Benutzer und Teams Primärschlüssel mit einem Spieler zu einem Team zuweisen mag:Ist es in Ordnung, JPA-Entitäten einfach als "Shell" für Primärschlüssel zu verwenden, oder ist das eine schlechte Übung?

myEjb.java

public void assignPlayer(Integer teamId, Integer playerId) { 
    Team team = em.find(Team.class, teamId); 
    team.getPlayers().add(new Player(playerId)); 
    em.merge(team); 
    . 
    . 
} 

Ist es falsch, dies zu tun? Ich fühle mich wie ich selbst einen zusätzlichen DB lesen bin sparen, indem der Spieler Primärschlüssel im Objekt anstelle ersten Tuns Einwickeln:

Player player = em.find(Player.class, playerId) 

Antwort

1

Nein, es ist keine gute Idee.

Zuerst ist der Aufruf von merge() nicht erforderlich.

Zweitens gibt es eine Standardmethode zum Erstellen einer Entität aus einer ID, ohne eine Abfrage auszuführen: getReference().

Team team = em.find(Team.class, teamId); 
team.getPlayers().add(em.getReference(Player.class, playerId)); 

Zumindest mit getReference() erhalten Sie eine echte, verwaltete Einheit. Und wenn der Code später in der Transaktion zufällig eine Methode für diesen Player aufruft, erhält er als Ergebnis null nicht: JPA lädt den Player-Status und gibt den korrekten Wert zurück.

+0

Wow, war dieser Methode nicht bewusst. Vielen Dank! – wsaxton