华佗养生网
您的当前位置:首页基于主键关联的双向一对一关联

基于主键关联的双向一对一关联

来源:华佗养生网
双向一对一关联-----基于主键关联的双向一对一关联

基于主键关联的双向一对一关联与基于主键关联的单向一对一关联类似,Hibernate通过标记和标记结合来定义这种关联。区别在于没有标记的一方增加了标记,从而建立了双向的一对一关联

映射文件

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\以约束一个表的主键同时作来外键参照另一个表的主键

因篇幅问题不能全部显示,请点此查看更多更全内容