Hibernate关联关系之一对一(外键关联)
2013-08-04 22:32
363 查看
测试用户类和地址类的一对一关联关系:
User类:
User.hbm.xml:
Address类:
Address.hbm.xml:
测试类:
User类:
package com.xxc.domain; public class User { private Integer id; private String name; private Address addr; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Address getAddr() { return addr; } public void setAddr(Address addr) { this.addr = addr; } }
User.hbm.xml:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xxc.domain.User" table="users" lazy="false"> <id name="id" column="id" type="integer"> <generator class="identity"></generator> </id> <property name="name" column="name" type="string" length="20"/> <!-- 在外键关联的一方,用多对一模拟一对一,这样的话还不是一对一,这时候要加 unique="true" 表示在多的一方的外键是不能重复的--> <many-to-one name="addr" class="com.xxc.domain.Address" column="addr" unique="true"/> </class> </hibernate-mapping>
Address类:
package com.xxc.domain; public class Address { private Integer id; private String province; private User user; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
Address.hbm.xml:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xxc.domain.Address" table="address" lazy="false"> <id name="id" column="id" type="integer" > <generator class="identity"></generator> </id> <property name="province" column="province" type="string" length="20"/> <!-- 属性参考:参考对端的映射addr属性的关联关系的方式 --> <one-to-one name="user" property-ref="addr"/> </class> </hibernate-mapping>
测试类:
package com.xxc.app; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.BeforeClass; import org.junit.Test; import com.xxc.domain.Address; import com.xxc.domain.User; public class App { private static SessionFactory sf = null; @BeforeClass public static void initialize(){ Configuration config = new Configuration(); /* 也可以写成这样的形式 * sf = config.addClass(Customer.class).addClass(Order.class).buildSessionFactory(); */ config.addClass(User.class); config.addClass(Address.class); sf = config.buildSessionFactory(); } @Test public void insertCustomer(){ Session session = sf.openSession(); Transaction t = session.beginTransaction(); User u = new User(); u.setName("HZ-XXC"); Address a = new Address(); a.setProvince("ZJ"); u.setAddr(a); u.setAddr(a); //先保存地址类,因为是用户存在外键,如果先保存用户,那么插入进去的用户数据的外键是null,等到地址数据插入的时候,还要进行一条update外键的操作。 session.save(a); session.save(u); t.commit(); session.close(); } @Test public void load(){//测试,真否真的是一对一关系。再插入一条id为1的数据 Session session = sf.openSession(); Transaction t = session.beginTransaction(); User u = new User(); u.setName("HKTK"); Address a = (Address) session.load(Address.class, 1);//查询id为1的地址类,并将这个类设置到新创建的User类中 u.setAddr(a); session.save(u);//会出异常,说Duplicate entry '1' for key 'addr' t.commit(); session.close(); } }
相关文章推荐
- Hibernate 第十讲 表关联关系(一)单项一对一外键关联
- Hibernate 一对一外键双向关联
- hibernate 关联关系 一对一 外间关联 .
- hibernate学习(6)——一对一单向外键关联
- hibernate一对一单向外键关联之Annotation
- Hibernate 一对一外键双向关联
- Hibernate一对一双向关联(外键)
- Hibernate一对一外键关联映射(单向)
- Hibernate关系映射(2)_一对一双向外键关联
- 闲来无事,复习复习以前的东西---hibernate中的关联映射图解----一对一唯一外键
- Hibernate学习13 -- 关联映射3 -- 一对一关联2 -- 一对一唯一外键关联
- Hibernate 一对一外键单向关联
- hibernate之一对一 外键关联 left join
- Hibernate 一对一外键单向关联
- Hibernate中 一对一 唯一外键关联映射
- hibernate 关系映射之 双向外键关联一对一
- java鬼混笔记:Hibernate:3、一对一关系之外键单向和双向关联
- Hibernate一对一外键单向关联关系
- Hibernate 一对一外键双向关联
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式