2017-12-04 3 views
1

Ich möchte eine Eins-zu-Eins-Zuordnung mit einer Join-Tabelle in unidirektionaler Weise haben. -One to One-Verbindung im Ruhezustand mit Fremdschlüssel und Join-Tabelle und unidirektional

Tables:

  1. A (A_Id, D_ID, A_Data)
  2. B (A_Id, C_Id) // Join-Tabelle nur Beziehung zwischen A und C enthalten
  3. C (C_Id, C_Data)

    Class A { 
        . 
        . 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinTable(name = "B", 
         joinColumns = @JoinColumn(name = "A_id", referencedColumnName = "A_id"), 
         inverseJoinColumns = @JoinColumn(name = "C_id", referencedColumnName = "C_id")) 
    private C c; 
    } 
    

ich mit JPA 2.0 hibernate verwenden. Entität D ist im Modell nicht wichtig und wird daher ignoriert. Ich möchte nur Daten lesen, daher sollte das Einfügen/Aktualisieren/Löschen von Anwendungsfällen nicht von Belang sein, aber man kann in diesem Fall auch Best Practice vorschlagen.

Diese Konfiguration funktioniert nicht. Kann jemand vorschlagen, wie man es richtig macht?

Es gibt folgende Ausnahme

org.hibernate.MappingException: Unable to find column with logical name: A_id in org.hibernate.mapping.Table(A) and its related supertables and secondary tables 
+0

Könnten Sie näher erläutern, was genau nicht für Sie funktioniert? Alle Fehlermeldungen wären hilfreich. –

+0

Warum brauchen Sie diese Beziehung? Wenn Sie eins-zu-eins wollen, fügen Sie ein zusätzliches Feld mit @OneToOne in A oder C –

+0

hinzu. Die Datenbank existiert seit langem und ich möchte das Schema nicht ändern. – anna

Antwort

0

Um Ihr gewünschtes Schema zu erhalten:

// Given the following C entity 
    @Entity 
    public class C { 

     @Id 
     @Column(name = "C_ID") 
     private long id; 

     private String C_Data; 

     //... 
    } 


    // A Entity should be 
    @Entity 
    public class A { 

     @Id 
     @Column(name = "A_ID") 
     private long id; 

     private String A_Data; 

     @OneToOne(cascade = CascadeType.ALL) 
     @JoinTable(name = "B", joinColumns = @JoinColumn(name = "A_id"), inverseJoinColumns = @JoinColumn(name = "C_id", unique = true)) 
     private C c; 

     //... 

    } 

ich referencedColumnName weggelassen habe, so überwintern wird es den Unternehmen Primärschlüssel zugeordnet werden.

Beachten Sie auch, dass A_id Spalte der B Tabelle der Primärschlüssel ist.

Verwandte Themen