Ich habe die folgenden zwei kommentierten Klassen, die ich zum Erstellen eines Diagramms verwende:
@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 */
}
Wenn ich den Graphen aufbaue, gebe ich zwei Abfragen aus, um alle Zeilen aus einer der beiden Tabellen zu holen und die Kind-/Eltern-Referenzen einzurichten, für die ich die in der Edge
Tisch.
Da ich die Beziehung zwischen den beiden Tabellen in JPA definiert habe, löst der Zugriff auf das Edge-Objekt zum Abrufen der IDs der beiden Knoten zwei SQL-Anweisungen pro Edge aus, wenn der JPA-Anbieter faul * lädt die zugehörigen Knotenpunkte. Da ich bereits über die Knotenobjekte verfüge und die IDs bereits aus der Kantentabelle geladen wurden, möchte ich diese Abfragen überspringen, da sie bei größeren Graphen furchtbar viel Zeit in Anspruch nehmen.
Ich habe versucht, diese Zeilen in die Edge
Klasse, aber dann will mein JPA-Anbieter, dass ich eine Zuordnung schreibgeschützt mache, und ich kann nicht scheinen, einen Weg zu finden, wie man das macht:
@Column(name = "ixNodeTo")
private long _ixNodeTo;
@Column(name = "ixNodeFrom")
private long _ixNodeFrom;
Ich verwende Eclipselink und MySQL, falls das wichtig ist.
**Das Standardverhalten für @ManyToOne
ist tatsächlich eifrig am Laden, siehe Pascals Antwort *