Ich habe folgende Struktur, die ich abbilden will:
Eine Department-Tabelle (Primary Key "Dept").
Nun will ich eine Kreuztabelle machen die die Beziehung Department -> übergeordnetes Department darstellt.
Ich habe dafür eine Tabelle "Dept_X_Dept" erstellt:
Quote:
public class OrgData_Dept_X_Dept implements Serializable {
//generated id
private int org_dept_x_dept_id;
// file contents
private OrgData_Department org_sub_dept;
private OrgData_Department org_super_dept;
public OrgData_Dept_X_Dept(){
super();
}
@Id
@GeneratedValue
public int getOrg_dept_x_dept_id() {
return org_dept_x_dept_id;
}
public void setOrg_dept_x_dept_id(int org_dept_x_dept_id) {
this.org_dept_x_dept_id = org_dept_x_dept_id;
}
@ManyToOne
@JoinColumn(name="org_sub_dept", unique=true)
public OrgData_Department getOrg_sub_dept() {
return org_sub_dept;
}
public void setOrg_sub_dept(OrgData_Department org_sub_dept) {
this.org_sub_dept = org_sub_dept;
}
@ManyToOne
@JoinColumn(name="org_super_dept")
public OrgData_Department getOrg_super_dept() {
return org_super_dept;
}
public void setOrg_super_dept(OrgData_Department org_super_dept) {
this.org_super_dept = org_super_dept;
}
In der Department-Tabelle habe ich die beiden Beziehungen ebenfalls dargestellt:
Quote:
@OneToMany (mappedBy="org_sub_dept", cascade=CascadeType.ALL)
public Set<OrgData_Dept_X_Dept> getOrg_sub_dept() {
return org_sub_dept;
}
public void setOrg_sub_dept(Set<OrgData_Dept_X_Dept> org_sub_dept) {
this.org_sub_dept = org_sub_dept;
}
public void addOrg_sub_dept(OrgData_Dept_X_Dept orgdata_dept_x_dept) {
this.org_sub_dept.add(orgdata_dept_x_dept);
orgdata_dept_x_dept.setOrg_sub_dept(this);
}
@OneToMany (mappedBy="org_super_dept", cascade=CascadeType.ALL)
public Set<OrgData_Dept_X_Dept> getOrg_super_dept() {
return org_super_dept;
}
public void setOrg_super_dept(Set<OrgData_Dept_X_Dept> org_super_dept) {
this.org_super_dept = org_super_dept;
}
public void addOrg_super_dept(OrgData_Dept_X_Dept orgdata_dept_x_dept) {
this.org_super_dept.add(orgdata_dept_x_dept);
orgdata_dept_x_dept.setOrg_super_dept(this);
}
Ich habe nun große Probleme, einen neuen Datensatz in der Dept_X_Dept-Tabelle anzulegen.
Ich habe folgende Implementierung:
Quote:
OrgData_Department OrgDept = session.find(OrgData_Department.class, strDept);
OrgData_Department OrgSuperDept = session.find(OrgData_Department.class, strSuperDept);
OrgDXD = new OrgData_Dept_X_Dept();
OrgDept.addOrg_sub_dept(OrgDXD);
OrgSuperDept.addOrg_super_dept(OrgDXD);
session.merge(OrgDXD);
tx.commit();
Wenn ich das so ausführe, funktioniert es, allerdings legt es mir den Datensatz, in dem Moment, wo das commit ausgeführt wird immer 2-fach an.
Wenn ich die sub_dept-Spalte als Unique definiere, dann kommt der Fehler:
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [OrgData_Dept_X_Dept], weil er den Datensatz nicht doppelt anlegen kann.
Das gleiche passiert auch, wenn ich session.merge(OrgDept) oder session.merge(OrgSuperDept) verwende.
Was auch nicht so richtig funktioniert, ist die Beziehung für das sub_Dept als @onetoone zu definieren. Das unique, was ich in der oneTomany-Beziehung nutze, scheint er auch zu ignorieren.
Hat jemand das Problem schon mal gehabt? Wie kann man es lösen? Gibt es einen Workaround?