2012-03-27 14 views
3

Ich versuche, eine Eins-zu-Eins-Beziehung zwischen zwei Tabellen zu erstellen.Eins-zu-Eins-Beziehung mit Hibernate

Einer von ihnen ist Person:

public class Person implements Serializable { 

static final long serialVersionUID = 1L; 


private long id; 
private String _email; 
    private String _pass; 

    public long getId() { 
     return id; 
    } 


    public void setId(long id) { 
     this.id = id; 
    } 

public String getEmail() { 
     return _email; 
    } 


    public void set_email(String _email) { 
     this._email = _email; 
    } 


    public String getPass() { 
     return _pass; 
    } 


    public void set_pass(String _pass) { 
     this._pass = _pass; 
    } 
} 

und die zweite ist ReqC2dmRegId Tabelle:

public class ReqC2dmRegId implements Serializable { 

private static final long serialVersionUID = 1L; 
Person person; 
String C2dmid; 
private long id; 

public ReqC2dmRegId(){} 

public String getC2dmid() { 
    return C2dmid; 
} 


public void setC2dmid(String c2dmid) { 
    C2dmid = c2dmid; 
} 

public ReqC2dmRegId(Person person, String C2dmid) { 
    super(); 
    this.person = person; 
    this.C2dmid = C2dmid; 
} 


public Person getPerson() { 
    return person; 
} 


public void setPerson(Person person) { 
    this.person = person; 
} 


public long getId() { 
    return id; 
} 


public void setId(long id) { 
    this.id = id; 
} 
} 

nun in meinem Programm, schaffe ich immer die Person erste und nur dann, wenn ich brauche ich hinzufügen dies .

Nun versuche ich, diese beiden Tabellen zu verknüpfen. Ich meine, wenn ich behalte diese ReqC2dmRegId (natürlich füge ich zu der Person in ReqC2dmRegId die richtige ID) Ich möchte meine ReqC2dmRegId zu aktualisieren oder speichern eine neue Zeile mit der richtigen Person ID.

Das sind meine hbm Dateien:

ReqC2dmRegId.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Mar 26, 2012 11:29:57 AM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="c2dm.ReqC2dmRegId" table="REQC2DMREGID"> 
     <id name="id" type="long"> 
     <generator class="foreign"> 
      <param name="property">person</param> 
      </generator> 
     </id> 
     <one-to-one name="person" class="Entities.Person" cascade="all" /> 


     <property name="C2dmid" type="java.lang.String"> 
      <column name="C2DMID" /> 
     </property> 
    </class> 
</hibernate-mapping> 

Person.hbm.xml

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Mar 26, 2012 11:29:57 AM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="Entities.Person" table="PERSON"> 
     <id name="id" type="long"> 
      <column name="ID" /> 
      <generator class="increment" /> 
     </id> 
     <property name="_email" type="java.lang.String" access="field"> 
      <column name="_EMAIL" /> 
     </property> 
     <property name="_pass" type="java.lang.String" access="field"> 
      <column name="_PASS" /> 
     </property> 
    </class> 
</hibernate-mapping> 

Was mache ich falsch?

Wenn ich versuche zu laufen:

//this should to update or save the object in DB 
     public void update (Object query){ 
        EntityManager em = emf.createEntityManager(); 
        em.getTransaction().begin(); 
        //em.createNativeQuery(query).executeUpdate(); 
        em.merge(query); 
        em.flush(); 
        em.getTransaction().commit(); 
        em.close(); 


       } 

ich:

attempted to assign id from null one-to-one property:Person 

Am Ende sollte es so aussehen:

Person

**id  email    _pass** 
2  [email protected]  1234 

ReqC2dmRegId

**id  REQC2DMREGID** 
2  ffgghhjj 

Update: nach gab ich versuche up Art und Weise zu verstehen, ist es nicht funktioniert
i meine ReqC2dmRegId.hbm.xml ändern wie folgt aussehen (many-to-one):

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Mar 27, 2012 9:58:08 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> 
    <class name="c2dm.ReqC2dmRegId" table="REQC2DMREGID"> 
     <id name="id" type="long"> 
      <column name="ID" /> 
      <generator class="identity" /> 
     </id> 
     <many-to-one name="person" class="Entities.Person" fetch="join" unique="true" cascade="save-update" not-null="true" > 
      <column name="PERSON" /> 
     </many-to-one> 
     <property name="C2dmid" type="java.lang.String"> 
      <column name="C2DMID" /> 
     </property> 
    </class> </hibernate-mapping> 

und dies funktioniert gut das Problem ist, wenn ich versuche, ReqC2dmRegId Tabelle mit meiner Update-Methode zu ändern, es schafft jetzt mit dem gleichen PersonID Zeile

id person_id C2dmid 
1  3   asd123 
2  3   dfvghj 

so ist es nicht aktualisieren die richtige reihe instatiert erstellen sie eine neue und obwohl ich die "viele zu eins" eigenschaft zu unique = "wahr" machen?

Dank im Voraus

+1

Warum nicht Sie verwenden Anmerkungen anstelle von XML-Datei? Ich finde Anmerkungen einfach und intuitiver – suenda

+0

Am Anfang fand ich xml ist einfacher für mich aus irgendeinem Grund .. und ich beginne mit ihnen zu arbeiten und jetzt ist es zu schwer, alle meine Objekte zu ändern .. – user986474

Antwort

0

Sie haben über die Art der Beziehung klar sein: Ist eine Eins-zu-eins oder many-to-one? Aussehen ist eine Viele-zu-Eins-unidirektionale Beziehung.Hier

ist ein Beispiel mit Anmerkungen:

@Entity 
@Table(name="PERSON") 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 
    private String _email; 
    private String _pass; 

    //getters and setters 
} 

Und die andere Klasse:

@Entity 
@Table(name="ReqC2dmRegId") 
public class ReqC2dmRegId { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 

@ManyToOne 
@JoinColumn(name = "PERSON_ID") 
private Person person; 

//getters and setters 

}