Hallo,
seid paar wochen probiere ich mich mit hibernate aus und bin seid 2 tagen mit einem problem beschäftigt, mit dem ich einfach nicht klar komme.
ich habe folgende objekte:
Code:
@Entity
@Table(name = "PERSON_TITEL")
public class PersonTitle {
@Id @GeneratedValue
@Column(name = "TITEL_ID")
private Long id;
@Column(name = "TITLE_NAME",unique=true)
private String name;
@Override
public int hashCode() {
// code für hashwert auf basis des TITLE-NAME feldes
}
@Override
public boolean equals(Object obj) {
// code für vergleich auf basis des TITLE-NAME feldes
}
...//setters und getters
}
@Entity
@Table(name = "PERSON")
public class Person {
@Id @GeneratedValue
@Column(name = "PERSON_ID")
private Long id;
@Column(name = "PERSON_NAME")
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "TITEL_REF")
private PersonTitle titel;
...//setters und getters
}
KURZ: jede Person hat einen Titel, jeder Titel ist eindeutig mit seinen Namen und daher auch nur ein eintrag pro Titel
nun soll folgender Code ausgeführt werden:
EntityManager em...
em.getTransaction.begin();
Person p1=new Person();
p1.setName("Max");
PersonTitle pt=new PersonTitle();
pt.setName("Herr");
p1.setTitle(pt);
// hibernate würde trägt automatisch beim commit das pt-entity mit in die datenbank
em.merge(p1);
em.getTransaction.commit();
em.getTransaction.begin();
Person p2=new Person();
p2.setName("Tobias");
PersonTitle pt2=new PersonTitle();
pt.setName("Herr");
p2.setTitle(pt);
em.merge(p2);
// hier kommt es zum Fehler (Duplicate entry 'Herr'): warum schaut Hibernate nicht in die datenbank, ob schon ein PersonTitle-Entity mit dem Name "Herr" existiert und besetzt dieses in das neu angelegte Object pt2 mit diesen entity???? oder sehe ich was total falsch in der funktionsweise von Hibernate
em.getTransaction.commit();
ich möchte einfach per forschleife personen einfügen und mich nicht bei jedem titel darum kümmern, ob dieser schon in der datenbank vorhanden ist. hibernate soll einfach selbst die entscheidung treffen, ob ein neuer PersonTitle-Eintrag getätigt werden soll oder nur eine referenz auf ein vorhandenen eintrag benutzt werden soll. Geht das überhaupt??
Ich wäre für einen kleinen Tipp sehr dankbar
mfg sven