标记,从而建立了双向的一对一关联映射文件
name=\"hibernate.wizard.chapter8.Person4\" table=\"C8_Person4\" schema=\"dbo\" >name=\"personId\"type=\"java.lang.String\" column=\"personId\" >
name=\"personName\"type=\"java.lang.String\" column=\"personName\" not-null=\"false\" length=\"50\" >
name=\"address\"class=\"hibernate.wizard.chapter8.Address4\" cascade=\"all\" />
name=\"hibernate.wizard.chapter8.Address4\" table=\"C8_Address4\" schema=\"dbo\" >name=\"personId\"type=\"java.lang.String\"
column=\"personId\" >
person
name=\"addressName\"type=\"java.lang.String\" column=\"addressName\" not-null=\"false\" length=\"50\" >
class=\"hibernate.wizard.chapter8.Person4\" constrained=\"true\" cascade=\"all\" />
持久化类 Person4类
public class Person4 implements Serializable {
private String personId;
private String personName;
private Address4 address;
public Person4(String personId, String personName) { this.personId = personId;
this.personName = personName;
}
public Person4() { }
public String getPersonId() { return this.personId; }
public void setPersonId(String personId) { this.personId = personId; }
public String toString() {
return new ToStringBuilder(this)
.append(\"personId\ .toString(); }
public String getPersonName() { return personName; }
public void setPersonName(String personName) { this.personName = personName; }
public Address4 getAddress() { return address; }
public void setAddress(Address4 address) { this.address = address; } }
Address4类
public class Address4 implements Serializable {
private String personId; private String addressName; private Person4 person;
public Address4(String personId,String addressName) { this.personId = personId;
this.addressName=addressName; }
public Address4() { }
public String toString() {
return new ToStringBuilder(this)
.append(\"addressId\ .toString();
}
public String getAddressName() { return addressName; }
public void setAddressName(String addressName) { this.addressName = addressName; }
public String getPersonId() { return personId; }
public void setPersonId(String personId) { this.personId = personId; }
public Person4 getPerson() { return person; }
public void setPerson(Person4 person) { this.person = person; } }
测试类
public class OneToOne4Test { Session session; Transaction tx;
public static void main(String[] args) { OneToOne4Test util=new OneToOne4Test(); util.insert(); }
public void insert(){ try {
session = HibernateUtil.getSession(); } catch (HibernateException ex) { System.out.println(ex); }
tx = session.beginTransaction();
Person4 p=new Person4(\"00001\张苹\");
Address4 addr=new Address4(p.getPersonId(),\"云山路\"); addr.setPerson(p); p.setAddress(addr); session.save(addr);
ArrayList result=(ArrayList)session.createQuery(\"from hibernate.wizard.chapter8.Address4 as a\" + \" where a.personId='00001'\").list(); for (int i=0;iSystem.out.println(\"---personId---addressName---personName---personId from Address4\");System.out.println(\"---\"+a.getPersonId()+\"---\"+a.getAddressName()+
\"---\"+a.getPerson().getPersonName()+\"---\"+a.getPerson().getAddress().getPersonId()); }
tx.commit();//提交事务
session.close();//关闭session } }
测试结果
初始化SessionFactory成功
Hibernate: select person4x_.personId, person4x_.personName as
personName11_ from dbo.C8_Person4 person4x_ where person4x_.personId=? Hibernate: insert into dbo.C8_Person4 (personName, personId) values (?, ?) Hibernate: insert into dbo.C8_Address4 (addressName, personId) values (?, ?) Hibernate: select address4x0_.personId as personId12_,
address4x0_.addressName as addressN2_12_ from dbo.C8_Address4 address4x0_ where address4x0_.personId='00001'
---personId---addressName---personName---personId from Address4 ---00001---云山路---张苹---00001
双向一对一关联注意事项
1.基于外键关联的\"双向一对一\"关联在”单向多对一“的关联的基础上,增加了另外一方的2.在定义基于外键关联的”双向一对一“关联时,需要在关联双方分别增加一个对方类型的属性,用于实现双向导航
3.基于主键关联的”双向一对一“关联的特别之处在于两个表之间共享主键的机制,是通过将一个表的主键同时作为外键参照另一个表的主键而实现的
4.在定义基于主键关联的”双向一对一“关联时,需要在关联双方分别添加一个对方类型的属性,用于实现双向导航。
5.在定义基于主键关联的”双向一对一“关联时,只需要在一方的标记中定义constrained=\"true\以约束一个表的主键同时作来外键参照另一个表的主键