Wie kann ich den Fremdschlüssel aus einer JPA ManyToOne-Zuordnung abrufen, ohne die Zieltabelle zu treffen?
Ich verwende die folgenden zwei mit Annotationen versehenen Klassen, um ein Diagramm zu erstellen:
@Entity
@Table(name = "Edge")
public class Edge
{
/* some code omitted for brevity */
@ManyToOne
@JoinColumn(name = "ixNodeFrom", nullable = false)
private Node _nodFrom;
@ManyToOne
@JoinColumn(name = "ixNodeTo", nullable = false)
private Node _nodTo;
/* some code omitted for brevity */
}
@Entity
@Table(name = "Node")
public class Node
{
/* some code omitted for brevity */
@OneToMany(mappedBy = "_nodTo")
private Set<Edge> _rgInbound;
@OneToMany(mappedBy = "_nodFrom")
private Set<Edge> _rgOutbound;
/* some code omitted for brevity */
}
Now, wenn ich das Diagramm erstelle, gebe ich zwei Abfragen aus, um alle Zeilen aus jeder Tabelle abzurufen und die untergeordneten / übergeordneten Referenzen einzurichten, für die ich die im @ gespeicherten IDs benötigEdge
Tabelle
Weil ich die Beziehung zwischen den beiden Tabellen in JPA definiert habe, löst der Zugriff auf das Kantenobjekt, um die IDs der beiden Knoten zu erhalten, zwei SQL-Anweisungen pro Kante aus, wenn der JPA-Anbieterträg * lädt die zugehörigen Knoten. Da ich die Knotenobjekte bereits habe und die IDs bereits aus der Kantentabelle geladen wurden, möchte ich diese Abfragen überspringen, da sie für größere Diagramme sehr lange dauern.
Ich habe versucht, diese Zeilen zum @ hinzuzufügeEdge
class, aber dann möchte mein JPA-Provider, dass ich eine Zuordnung schreibgeschützt mache, und ich kann anscheinend keinen Weg finden, wie das geht:
@Column(name = "ixNodeTo")
private long _ixNodeTo;
@Column(name = "ixNodeFrom")
private long _ixNodeFrom;
Ich verwende Eclipselink und MySQL, wenn es darauf ankommt.
** Das Standardverhalten für@ManyToOne
ist eigentlich eifrig geladen, siehe Pascals Antwort*