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
Warum nicht Sie verwenden Anmerkungen anstelle von XML-Datei? Ich finde Anmerkungen einfach und intuitiver – suenda
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