2010-12-13 10 views
0

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; 

Antwort

0

Warum benötigen Sie die Join-Tabelle? Für eins zu viele sollte es nicht notwendig sein. Sie sollten die JoinTable-Annotation vollständig löschen können? oder gibt es einen Grund, warum du es brauchst?

+0

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? –

+0

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. –

+0

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. –

Verwandte Themen