2012-03-27 117 views
3

我嘗試在兩個表之間創建一對一的關係。與休眠一對一關係

其中之一就是人:

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; 
    } 
} 

,第二個是ReqC2dmRegId表:現在

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; 
} 
} 

,在我的節目,我總是創造Person第一,只有當我需要我補充這ReqC2dmRegId

現在,我試圖做的是鏈接這兩個表。我的意思是,當我堅持這個ReqC2dmRegId(當然我加入ReqC2dmRegId的人的正確ID)我想我的ReqC2dmRegId更新或保存一個新的行與正確的Person ID。

這些都是我的HBM文件:

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> 

我在做什麼錯?

當我嘗試運行:

//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(); 


       } 

我得到:

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

最後,它應該是這樣的:

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

ReqC2dmRegId

**id  REQC2DMREGID** 
2  ffgghhjj 

更新: 後,我放棄了試圖理解方式,它不工作
我改變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 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> 

,這是工作的罰款的問題是,當我試圖修改ReqC2dmRegId表 我更新的方法是創建一個與現在相同PERSONID

它不更新正確的行安裝創建一個新的,雖然我讓「多對一」屬性是唯一=「真」?

在此先感謝

+1

你爲什麼不使用註釋,而不是XML文件?我發現註解容易,更直觀 – suenda 2012-03-27 19:53:54

+0

在開始時我發現xml對我來說更容易,出於某種原因..我開始與他們合作,現在很難改變我的所有對象。 – user986474 2012-03-27 20:29:34

回答

0

你必須要清楚的一種關係:是一個一對一或多對一的一個? 看起來像是一個多對一的單向關係。

下面是註釋的例子:

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

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

    //getters and setters 
} 

而其他類:

@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 

}