Java 与hibernate的一对一关系
我尝试在两个表之间创建一对一的关系 其中之一是个人:Java 与hibernate的一对一关系,java,hibernate,Java,Hibernate,我尝试在两个表之间创建一对一的关系 其中之一是个人: 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 vo
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>
我得到:
attempted to assign id from null one-to-one property:Person
最后,它应该是这样的:
人
**id email _pass**
2 lala@gmail.com 1234
ReqC2dmRegId
**id REQC2DMREGID**
2 ffgghhjj
更新:
在我放弃之后,试着去理解它不起作用的方式我更改了我的reqc2dmrgid.hbm.xml 看起来像这样(多对一): 它不是更新正确的行,而是创建一个新的行,尽管我将“多对一”属性设置为唯一=“true”
提前感谢你必须弄清楚这种关系:是一对一还是多对一? 看起来是一个多对一的单向关系 下面是一个带有注释的示例:
@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
}
为什么不使用注释而不是XML文件?我发现注释更简单、更直观。一开始,我发现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>
id person_id C2dmid
1 3 asd123
2 3 dfvghj
@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
}