Ich habe eine Entität, die 0 oder viele untergeordnete Elemente derselben Entität haben kann. Außerdem kann eine Entität 0 oder ein Elternteil derselben Entität haben.JoinTable (übergeordnetes/untergeordnetes Element) zu self tritt immer bei JoinTable beim Laden ein
Tabellen Struktur
Account (
AccountId PK,
Name char
etc...
)
AccountRef (
ChildId PK, FK references Account(AccountId)
ParentId PK, FK references Account(AccountId)
)
Alles funktioniert ich Konto korrekt außer jederzeit laden, join a immer auf dem Tisch kommt getan (Ich gehe davon aus, um zu sehen, ob es eine AccountRef Datensatz) . Die Abfrage verbindet sich nicht mehr mit der Account-Entität. Wenn Sie also account.getMasterAccount() ausführen, wird eine Verknüpfung zu AccountRef und dann zurück zu Account hergestellt, um den Master abzurufen. Auch dies ist alles korrekt, aber nicht optimal, da der Join bei Bedarf zweimal durchgeführt wird und einmal nicht benötigt wird.
Ist der einzige Weg, um Instrumentierung für LazyToOne zu verwenden, oder gibt es eine bessere Möglichkeit, dies zu kartieren? Dies ist eine Legacy-Tabellenstruktur, die ich nicht ändern kann.
@Entity
Account {
@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="masterAccount")
private Set<Account> subAccount;
@ManyToOne(fetch=FetchType.LAZY)
@JoinTable(name="AccountRef",
joinColumns = @JoinColumn(name="childId", referencedColumnName="accountId"),
inverseJoinColumns = @JoinColumn(name="parentId", referencedColumnName="accountId")
)
private Account masterAccount;
Die bidirektionalen Zuordnungen werden in einer separaten Tabelle, AccountRef, gespeichert, weshalb ich die Join-Tabelle verwendet habe. Gibt es einen besseren Weg dies zu kartieren? –
experimentieren Sie mit, wie es funktioniert, wenn Sie die Join-Tabelle nicht haben. Sie können bidirektionales Mapping ohne die Join-Tabelle erreichen. Das einzige Mal, wenn Sie es nicht wollen, ist es, wenn die Beziehung nicht kommutativ ist. Wenn A ein Elternteil von B ist, heißt das nicht, dass B ein Kind von A ist. –
Sie sagen also, entfernen Sie die Join-Tabelle und erstellen Sie eine separate Entität für AccountRef und verwenden Sie Anwendungscode, um es synchron zu halten? AccountRef wird von Legacy-Anwendungen benötigt. –