These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: duplicate vermeiden??
PostPosted: Mon Jan 15, 2007 7:27 am 
Newbie

Joined: Mon Jan 15, 2007 7:05 am
Posts: 2
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


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 15, 2007 10:37 am 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Weil PT als Primary Key eine generierte Zahl hat. Der PK ist null also wird er neu erzeugt und Hibernate fügt das ein. Woher soll Hibernate wissen, dass es aus einem Unique Key constraint folgern soll, dass das einfügen ein Update sein soll.

Prüfe also zu Fuß, ob der PT schon existiert und lege ihn dann an.

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 15, 2007 11:42 am 
Newbie

Joined: Mon Jan 15, 2007 7:05 am
Posts: 2
danke erstmal für die antwort.

was nützt dann aber der eintrag @Column(unique=true), wenn ich doch selbst prüfen muss, ob dieser eintrag schon vorhanden ist oder nicht. mir ist klar, dass mit unique auf datenbank ebene sichergestellt wird, dass kein doppelter eintrag auftaucht.
daher sollte es (aus meiner sicht) ne möglichkeit geben, dass man auf eine einfache art und weise eine neue entity anlegen kann und dann automatisch mit der datenbank überprüft wird, ob schon vorhanden oder neu angelegt werden muss, ohne dass erst per query gefragt werden muss, ob eine eintrag mit bestimmten namen vorhanden ist.
vielleicht sehe ich dies auch falsch. der new operator wird auch nicht korrekt in meinem beispiel sein, da dies ja wirklich eine neue entity erzeugt.
existiert vielleicht eine technik in hibernate, die wie refresh() arbeitet, aber eben eine transiente entity in eine vorhanden entity umwandelt,sofern diese existiert?

mfg sven


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 15, 2007 12:44 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
unique erzeugt einen Unique constraint in der Datenbank, wenn man die TAbellen über Hibernate erzeugt.
Entwickler A) hätte gerne Deine Variante und Entwickler B möchte eben, dass ein Fehler geworfen wird, wenn er einen Unique Constraint festlegt, weil z.B. ein Eingabe falsch ist.

Ein Eintrag wird von Hibernate über den Primary Key identifiziert und nicht über irgendwelche anderen Felder. Du könntest also den Namen als Primary Key festlegen und session.saveOrUpdate verwenden zum speichern.

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 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.