2012-03-27 113 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 

}