Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 2 posts ] 
Author Message
 Post subject: Kreuztabellendefinition
PostPosted: Thu Dec 09, 2010 9:48 am 
Newbie

Joined: Thu Dec 09, 2010 9:31 am
Posts: 2
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?


Top
 Profile  
 
 Post subject: Re: Kreuztabellendefinition
PostPosted: Thu Dec 09, 2010 10:04 am 
Newbie

Joined: Thu Dec 09, 2010 9:31 am
Posts: 2
Kaum habe ich es geschrieben, habe ich die Lösung gefunden. Damit funktioniert es:

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);
OrgDXD.setOrg_super_dept(OrgSuperDept);
//OrgSuperDept.addOrg_super_dept(OrgDXD);

session.merge(OrgDept);
tx.commit();


Man darf nur für eine Beziehung das Add verwenden, für die andere darf man nur die Referenz zuweisen.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.