2012-10-12 15 views
5

Ich habe zwei Modelle.Hibernate (JPA) multiple @ OneToMany für das gleiche Modell

@Entity 
public class Student 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    protected long id; 

    @? 
    protected Address homeAddress; 

    @? 
    protected Address schoolAddress; 
} 

@Entity 
public class Address 
{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    protected long id; 

    @? 
    protected List<Student> students; 
} 

Was JPA/Hibernate Annotations muss ich über homeAddress, schoolAddress und students setzen, um die Verbandsarbeit zu machen?

Natürlich habe ich viele Dinge ausprobiert und nichts hat funktioniert. Zum Beispiel Unable to find column with logical name: student_homeAddress_id in org.hibernate.mapping.Table(Address) and its related supertables and secondary tables

@ManyToOne 
    @JoinColumn (name="student_homeAddress_id", updatable = false, insertable = false) 
    protected Address homeAddress; 

    @ManyToOne 
    @JoinColumn (name="student_schoolAddress_id", updatable = false, insertable = false) 
    protected Address schoolAddress; 

und

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) 
    @JoinColumns({ 
    @JoinColumn(name = "student_homeAddress_id", referencedColumnName = "student_homeAddress_id"), 
    @JoinColumn(name = "student_schoolAddress_id", referencedColumnName = "student_schoolAddress_id")}) 
    @IndexColumn(name="students_index") 
    protected List<Student> students; 

yealds Einstellung. versuchten auch mappedBy verwenden, aber das nimmt ein einziges Argument (nicht mappedBy="student_homeAddress_id, student_schoolAddress_id" tun.

Auch die JoinColumns zur Student Tablette sah in bewegten, aber ich bin nicht sicher, was die Anmerkungen wie für OneToMany und ManyToOne aussehen sollten wie ich mehrere Adressen gibt, die JoinColumns nicht viel Sinn machen

die Sache, die Arbeit haben, aber war die Schaffung nicht die Verbände hatte.

@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER) 
    @JoinColumn(name="address_id") 
    @IndexColumn(name="students_index") 
    protected List<Student> students; 

diese verwenden, wenn sie in der DB, die Modelle zu speichern, die student_homeAddress_id und student_schoolAddress_id waren immer Null, auch nachdem beide Enden gespeichert wurden (das Student- und Address-Modell).

Mein Gedanke ist, dass auf der Address Tabelle wird es drei zusätzliche Spalten sein: student_homeAddress_id (die ID des Studenten in der Studententabelle für die homeaddress), student_schoolAddress_id (die ID des Studenten in der Studententabelle für die schoolAddress) und students_index (der 0-basierte Ort auf der Liste). Das sollte ausreichen, richtig?

Irgendwelche Ideen?

Vielen Dank!

Antwort

3

Wir versuchten Maels Vorschlag, aber wir konnten es nicht funktionieren lassen.

Wir endete nach this, die funktionierte.

Mit anderen Worten, wir haben OneToMany Beziehungen:

Auf Student:

protected List<AddressStudentAssociation> addresses; 

Auf Address:

protected List<AddressStudentAssociation> students; 

Und auf AddressStudentAssociation:

@ManyToOne 
@PrimaryKeyJoinColumn(name="STUDENTID", referencedColumnName="id") 
private Student student; 
@ManyToOne 
@PrimaryKeyJoinColumn(name="ADDRESSID", referencedColumnName="id") 
private Address address; 

plus ein Argument, um die eine Adresse von der anderen zu trennen (isHome).

Schließlich haben wir innerhalb Studentpublic Address getHomeAddress(), die die addresses Liste durchläuft und die richtige Adresse zurückgibt. Wir mussten auch mit den Anmerkungen spielen, damit es funktioniert. Im Allgemeinen nicht optimal, aber es funktioniert und wir haben bereits zu viel Zeit damit verbracht, die Dinge zum Laufen zu bringen. : |

4

Wenn Sie eine Entität haben, die Sie @OneToMany in mehr als einem Feld zuordnen möchten, sollten Sie @JoinTable verwenden, damit Hibernate 2 Tabellen für die Beziehung generieren kann.

Vom @JoinTable javadoc:

Ein Join-Tabelle typischerweise in der Abbildung von many-to-many und unidirektionale Assoziationen one-to-many verwendet wird. Es kann auch verwendet werden, um bidirektionale Viele-zu-Eins/Eins-zu-Viele-Zuordnungen, unidirektionale Viele-zu-Eins-Beziehungen und Eins-zu-Eins-Zuordnungen ( bidirektional und unidirektional) zuzuordnen.

Wenn eine Join-Tabelle in Abbildung eine Beziehung mit einer embeddable Klasse auf der besitzenden Seite der Beziehung verwendet wird, die enthält Entität anstatt die integrierbare Klasse ist der Besitzer der Beziehung betrachtet. Wenn die JoinTable-Annotation fehlt, gelten die Standardwerte der Annotationselemente .Der Name der Join-Tabelle wird als angenommen, wobei die Tabellennamen der verknüpften Primärtabellen miteinander verkettet werden (mit der ersten Seite), wobei ein Unterstrich verwendet wird.

dieses Beispiel nehmen:

@Entity 
@Indexed(index = "causa_penal") 
@Table(name = "causas_penales") 
public class CausaPenal implements Serializable { 



    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @Column(name = "id") 
    @DocumentId 
    private Integer id; 

    @Version 
    @Column(name = "opt_lock") 
    private Integer version; 

    @ManyToMany(cascade = { CascadeType.ALL }) 
    @JoinTable(name = "causapenal_imputados") 
    @IndexedEmbedded(depth = 1) 
    private List<ParteMaterial> imputados; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "causapenal_victimas") 
    @IndexedEmbedded(depth = 1) 
    private List<ParteMaterial> victimas; 

    //Getters and Setters 
} 

Wie Sie sehen können, habe ich CausaPenal zweimal ParteMaterial zeigen. Aber ich brauche diese Liste, um unabhängig voneinander zu sein. Mit @JoinTable erkläre ich Hibernate, dass diese Beziehung mit 4 Tabellen zugeordnet werden muss: "causa_penal" für die CausaPenal-Entität, "causa_penal_imputados" für die Beziehung von CausaPenal und dem imputados-Feld, das einer ParteMaterial-Entität zugeordnet ist und dasselbe für victimas und schließlich die Tabelle für ParteMaterial Entity.

Verwandte Themen