2010-09-21 10 views
6

Ich habe eine Frage zu Hibernate ManyToMany-Zuordnungen. Ich habe zwei Klassen A und B und die Zuordnung zwischen ihnen ist eine ManyToMany Mapping von Hibernate aufgelöst:Hinzufügen eines separaten Primärschlüssels zu einer Join-Tabelle im Ruhezustand

@Entity 
@Table(name="A") 
public class A { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="C", [email protected](name="a_id"), [email protected](name="b_id")) 
    private Set bs; 
} 

@Entity 
@Table(name="B") 
public class B { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany(mappedBy="bs") 
    private Set bs; 
} 

Wie Sie sehen können, der Table-Join ich benutze, ist C. Der Fremdschlüssel A und B „a_id "und" b_id ". Mein Verständnis ist, dass Hibernate einen zusammengesetzten Primärschlüssel mit a_id und b_id für Tabelle C erstellt.

Ich möchte keine Entität C in meinem Modell haben. Aber anstelle eines zusammengesetzten Primärschlüssels in Tabelle C hätte ich gerne eine generierte ID und eine eindeutige Einschränkung für die Felder a_id und b_id.

Ist es möglich, Hibernate mitzuteilen, einen separaten Primärschlüssel zu verwenden? Ohne eine Entität C hinzuzufügen?

Ich würde jede Hilfe zu schätzen wissen.

Vielen Dank!

Antwort

1

Ich glaube nicht, dass es möglich ist. Und ich sehe kein Problem bei der Definition einer C Einheit.

Wenn Sie zusätzliche Informationen in der Join-Tabelle haben, können Sie darauf nicht zugreifen, da Set die Zieleinheit enthält - A oder B.

Auch Ihre Set s würde besser Generika verwenden - d. H. Set<A> und Set<B>.

Btw, Hibernate wird möglicherweise nicht durch die Tatsache alarmiert, dass die Tabelle eine andere Entität erstellt - die Verwendung Ihrer aktuellen Zuordnung funktioniert möglicherweise (abgesehen von der ID-Spalte). Als Sie "Hibernate creates" sagten, nahm ich an, dass Sie Ihr Schema aus Ihrem Entitätsmodell generieren. Jetzt scheint es das Gegenteil zu sein, also probier es aus.

+0

Der Punkt ist die Datenbank existiert bereits mit der gegebenen Struktur (und aus alten Gründen ist es nicht wirklich anpassungsfähig). Die Tabelle hat nichts mehr als die drei Felder, über die ich geschrieben habe (id, a_id, b_id). Es wäre nett, neue Einträge in C einzufügen, ohne eine (nutzlose) C-Entität in meinem Code zu erstellen. Aber trotzdem danke für die Antwort. Ich denke, ich muss einfach diese Entität dann erstellen ... – BHulliger

+0

@BHulliger siehe mein Update – Bozho

1

Aber statt eines zusammengesetzten Primärschlüssels in Tabelle C hätte ich gern eine generierte ID und eine eindeutige Einschränkung für die Felder a_id und b_id.

Normalerweise besteht der Primärschlüssel des JoinTable aus der Kombination beider Fremdschlüssel. Zumindest würde dies JPA generieren. Wenn Sie jedoch den JPA-Anbieter nicht zum Generieren des Modells verwenden und die PK von der Datenbank generiert werden kann (mithilfe einer IDENTITY-Spalte, eines Triggers usw.), sollten Sie die C-Tabelle für Ihre ManyToMany-Verknüpfung verwenden können (ohne eine zusätzliche Entität einführen zu müssen und die Beziehung in zwei zu transformieren OneToMany). Hast du es wirklich versucht?

5

Sie sollten Iyt so tun. Aber es kann nur für die Liste appelliert werden (nicht für Sätze)

@Entity 
@TableGenerator(name="ids_generator", table="IDS") 
public class Passport { 
    ... 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="PASSPORT_VISASTAMP") 
    @CollectionId(
     columns = @Column(name="COLLECTION_ID"), 
     [email protected](type="long"), 
     generator = "ids_generator" 
    ) 
    private Collection<Stamp> visaStamp = new ArrayList(); 
    ... 
} 
Verwandte Themen