Hibernate (JPA) mehrere @OneToMany für das gleiche Modell
Habe ich zwei Modelle.
@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 brauche ich um über homeAddress
, schoolAddress
und students
um die Vereinsarbeit?
Natürlich habe ich vieles ausprobiert und nichts hat funktioniert.
Zum Beispiel, Einstellung
@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 Unable to find column with logical name: student_homeAddress_id in org.hibernate.mapping.Table(Address) and its related supertables and secondary tables
.
Habe auch versucht mit mappedBy
aber das nimmt ein einzelnes argument (kann nicht mappedBy="student_homeAddress_id, student_schoolAddress_id"
.
Schaute auch in das verschieben der JoinColumns
zu den Student
tablet, aber ich bin nicht sicher, was die Anmerkungen, die Aussehen sollte wie für OneToMany ManyToOne und da habe ich mehrere Adressen gibt, die JoinColumns macht nicht viel Sinn.
Der Sache, hat funktioniert, war aber nicht die Schaffung der Verbände war:
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, fetch = FetchType.EAGER)
@JoinColumn(name="address_id")
@IndexColumn(name="students_index")
protected List<Student> students;
Verwenden diese beim speichern in die DB die Modelle, die student_homeAddress_id und student_schoolAddress_id waren immer null, auch nach Lagerung der beiden enden (der Student und Adresse Modell).
Mein Gedanke ist, dass auf der Address
Tabelle es werden 3 zusätzliche Spalten: student_homeAddress_id (die id des Studenten in der Student-Tabelle für die homeAddress), student_schoolAddress_id (die id des Studenten in der Student-Tabelle für die schoolAddress) und students_index (die 0-basierte Position auf der students
Liste). Das sollte ausreichen, richtig?
Irgendwelche Ideen?
Vielen Dank!
InformationsquelleAutor iliask | 2012-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine Person, die Sie verknüpfen möchten @OneToMany in mehr als einem Feld, das Sie verwenden sollten, @JoinTable, damit Hibernate generieren kann 2 Tabellen für die Beziehung.
Vom @JoinTable javadoc:
Nehmen Sie dieses Beispiel:
Wie Sie sehen können, habe ich CausaPenal Hinweis auf ParteMaterial zweimal. Aber ich brauche diese Liste, um unabhängig von jedem anderen. Also mit @JoinTable ich sagen, Hibernate, dass diese Beziehung zugeordnet sein muss mit 4 Tabellen: "causa_penal" für die CausaPenal Entität, "causa_penal_imputados" für die Beziehung von CausaPenal und die imputados Feld zugeordnet ist, einen ParteMaterial Person und das gleiche für victimas und schließlich die Tabelle für ParteMaterial Einheit.
InformationsquelleAutor ElderMael
Wir haben versucht, mael ' s Vorschlag, aber wir konnte nicht damit es funktioniert.
Landeten wir folgende diese was auch geklappt hat.
In anderen Worten, wir haben
OneToMany
Beziehungen:Auf
Student
:Auf
Address
:Und auf
AddressStudentAssociation
:plus ein argument zu trennen, die eine Adresse von der anderen (
isHome
).Schließlich, im inneren
Student
wir habenpublic Address getHomeAddress()
die Traversen deraddresses
Liste und gibt die richtige Adresse. Wir hatten auch zu spielen mit den Anmerkungen zu machen, damit es funktioniert. Nicht optimal, aber es funktioniert und wir haben bereits zu viel Zeit damit verbracht, um die Dinge funktionieren. 😐InformationsquelleAutor iliask