2013-08-23 24 views
5

Ich brauche Ihre Hilfe, um die Beziehung in Hibernate von zwei Tabellen mit der @ElementCollection Annotation zuzuordnen.JPA: wie @ElementCollection Annotation verwenden?

Die erste ist die übergeordnete Tabelle
Tabellenname: Geordnetes
DB Columns

KEY1   Char  (first primary key field) 
KEY2   Char  (second primary key field) 
DESCRIPTION Char 
DEPENDENTID BigInt 

Der zweite die abhängige Tabelle
Tablename ist: Dependent
DB Columns

PARENTID  BigInt (first primary key field) 
CODE   Char  (second primary key field) 
FIELD1  Char 
FIELD2  Char 

Ich brauche die PK für beide Tabellen mit @EmbeddedId Anmerkung zu definieren, so habe ich die zwei Klassen erstellt:

@Embeddable 
public class ParentPK implements Serializable 
{ 
    @Column(name="K1") 
    private String iK1; 
    @Column(name="K2") 
    private String iK2; 
    // I omit the constructor, getter, setter, equals, hashcode method 
} 

@Embeddable 
public class DependentPK implements Serializable 
{ 
    @Column(name="PARENTID") 
    private String iParentId; 
    @Column(name="CODE") 
    private String iCode; 
    // I omit the constructor, getter, setter, equals, hashcode method 
} 

und dann habe ich die beiden Bohnen erstellt:
Die Klasse für die abhängige Tabelle .
Beachten Sie, dass ich nicht will

in dieser Klasse
@Entity 
@Table(name = "DEPENDENT") 
public class DependentBean implements Serializable 
{ 
    @EmbeddedId 
    private DependentPK iDependentPK; 
    @Column(name = "FIELD1") 
    private String iField1; 
    @Column(name = "FIELD2") 
    private String iField2; 
    // I omit the constructor, getter, setter methods 
} 

Und die Klasse jede relationale Anmerkung haben für die übergeordnete Tabelle

@Entity 
@Table(name = "PARENT") 
public class ParentBean implements Serializable 
{ 
    @EmbeddedId 
    ParentPK iParentPK; 
    @Column(name = "DESCRIPTION") 
    private String iDescription; 
    @Column(name = "DEPENDENTID") 
    private long iDependentId; 
    @ElementCollection 
    @CollectionTable(name="DEPENDENT", joinColumns={@JoinColumn(name="PARENTID", referencedColumnName="DEPENDENTID")}) 
    private Set<DependentBean> iDependentBeans = new HashSet<DependentBean>(); 
    // I omit the constructor, getter, setter methods 
} 

Als ich mich den Fehler hätte zu implementieren versuchen:

Caused by: org.hibernate.MappingException: Foreign key (FK9619C2A17B05CB2:DEPENDENT [iDependentBeans_PARENTID,iDependentBeans_CODE])) must have same number of columns as the referenced primary key (DEPENDENT [PARENTID,iDependentBeans_PARENTID,iDependentBeans_CODE])

Also mache ich etwas falsch, aber ich kann mir nicht vorstellen, was. Könnte mir bitte jemand helfen?

Antwort

7

@ElementCollection sollte mit Basistyp oder Embeddable-Klasse verwendet werden, nicht für Entität.

Die abhängigeBean ist eine Entität.

versuchen, einen zu viele Mapping verwenden und Ihr Schema

ELTERN Schema

KEY1   Char  (PK) 
KEY2   Char  (PK) 
DEPENDENTID BigInt (PK) 
DESCRIPTION Char 

ABHÄNGIGEN Schema

CODE   Char  (PK) 
PARENTID  BigInt (FK) 
KEY1   Char  (FK) 
KEY2   Char  (FK) 
FIELD1  Char 
FIELD2  Char 

one to many Mapping

ParentPK

ändern
@Embeddable 
public class ParentPK { 
    @Column(name = "K1") 
    private String iK1; 
    @Column(name = "K2") 
    private String iK2; 
    @Column(name = "DEPENDENTID") 
    private long iDependentId; 
} 

ParentBean

@Entity 
@Table(name = "PARENT") 
public class ParentBean { 
    @EmbeddedId 
    ParentPK iParentPK; 

    @OneToMany(mappedBy = "parent") 
    List<DependentBean> iDependentBeans; 
} 

DependentBean

@Entity 
@Table(name = "DEPENDENT") 
public class DependentBean { 
    @Id 
    @Column(name = "CODE") 
    private String iCode; 

    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "PARENTID", referencedColumnName = "iDependentId"), 
     @JoinColumn(name = "K1", referencedColumnName = "iK1"), 
     @JoinColumn(name = "K2", referencedColumnName = "iK2") }) 
    ParentBean parent; 
} 
+0

Erstmal Danke für deine Antwort. Aber ich habe gesehen, dass die Verwendung von onetomany Annotation Hibernate einen Beitritt machen, wenn auf die Elterntabelle zugegriffen wird. Ich muss nur auf die abhängige Tabelle zugreifen, wenn auf ihr Attribut zugegriffen wird.Also, wie geht das? – gpezzini

+0

Ich denke, Sie verwenden @OneToMany (fetch = FetchType.EAGER), dies wird sicherlich eine Verknüpfung wie Sie sagen. Versuchen Sie, @OneToMany (fetch = FetchType.LAZY) zu verwenden, und stellen Sie sicher, dass Sie vor dem Schließen der Sitzung auf das Attribut zugreifen. Andernfalls erhalten Sie eine LazyInitializationException. – study

+0

Hallo nochmal, aber ist es möglich ein OneToMany zwischen meinen beiden Tabellen zu definieren ** Eltern ** und ** Abhängig **? Wie Sie sehen ** Die Tabelle ** Parent ** enthält das Feld 'DEPENDENTID', das möglicherweise mit dem Feld 'PARENTID' der Tabelle ** Dependent ** verknüpft ist. ** Dependent ** Tabelle hat ein anderes Primärschlüsselfeld: 'CODE'. Die beiden Tabellen haben ihre eigenen Primärschlüssel, die unter Verwendung einer einbettbaren Klasse beschrieben werden. Also, ist es Ihrer Meinung nach möglich, die @ OneToMany Annotation in diesem Szenario zu verwenden? Ich habe es auf verschiedene Arten ohne Erfolg versucht und ich habe viele Suchen ausprobiert, ohne nichts zu finden. Vielen Dank im Voraus für Ihre Zeit – gpezzini

Verwandte Themen