Hibernate 关系映射(四) 基于中间表关联的单向1:1
2017-03-27 11:20
387 查看
1.单向 1:1 基于中间表
想象下 小康社会: 每家都有钱, 住起了小洋房 ,洋房编号: xx村2-36
eg: 一个地方有 一个人住.或者说 一家人住
eg: 每个同学家庭请了单独家教老师, 这样 1 对 1 的辅导
(在 原本N 变成了 1 的一端进行配置)
1 (N) 1
Person : Address
Student : Teacher
注意:采用中间表来保存 1:1 的关系
注意使用 unique=true cascade=all
中间表
person
address
//test
注意:cascade="all"
会出现异常:
大小: 75.3 KB
大小: 84 KB
大小: 79.2 KB
查看图片附件
想象下 小康社会: 每家都有钱, 住起了小洋房 ,洋房编号: xx村2-36
eg: 一个地方有 一个人住.或者说 一家人住
eg: 每个同学家庭请了单独家教老师, 这样 1 对 1 的辅导
(在 原本N 变成了 1 的一端进行配置)
1 (N) 1
Person : Address
Student : Teacher
注意:采用中间表来保存 1:1 的关系
注意使用 unique=true cascade=all
中间表
person
address
public class Address { private Integer aid; private String addressDetail; //set get ... } public class Person { private Integer pid; private String name; private int age; private Address address; //单向(N:1) 反过来(1:1) //set get... }
--基于中间表的 1:1 关系 DROP TABLE IF EXISTS mytest.person_address; CREATE TABLE mytest.person_address ( person_id INT NOT NULL, address_id INT, PRIMARY KEY (person_id), UNIQUE KEY address_id (address_id), KEY FK23F8B90A7AAE85B2 (person_id), KEY FK23F8B90AE6A03022 (address_id), CONSTRAINT FK23F8B90A7AAE85B2 FOREIGN KEY (person_id) REFERENCES person (PID), CONSTRAINT FK23F8B90AE6A03022 FOREIGN KEY (address_id) REFERENCES address (AID) ); # DROP TABLE IF EXISTS mytest.person; CREATE TABLE mytest.person ( PID INT NOT NULL, NAME VARCHAR (255), AGE INT, PRIMARY KEY (PID) ); # DROP TABLE IF EXISTS mytest.address; CREATE TABLE mytest.address ( AID INT NOT NULL, ADDRESSDESC VARCHAR (255), PRIMARY KEY (AID) );
<!--person--> <hibernate-mapping package="com.sh.study.model.o2o"> <class name="Person" table="PERSON"> <id name="pid" type="java.lang.Integer" column="PID"> <generator class="increment"/> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="age" type="int"> <column name="AGE" /> </property> <!-- 基于外键的 单向 1:1 注意 cascade--> <!-- unique="true" 表示 N 的一端必须是 唯一即可 这样就变成 单向 1:1 <many-to-one name="address" unique="true" cascade="all" class="Address" column="address_id"> </many-to-one> --> <!-- 基于中间表的 1:1 关系 --> <join table="person_address"> <key column="person_id"/> <many-to-one name="address" cascade="all" unique="true" class="Address" column="address_id"/> </join> </class> </hibernate-mapping> <!--address--> <hibernate-mapping package="com.sh.study.model"> <class name="Address" table="ADDRESS"> <id name="aid" type="java.lang.Integer" column="AID"> <generator class="increment"/> </id> <property name="addressdesc" type="java.lang.String"> <column name="ADDRESSDESC" /> </property> </class> </hibernate-mapping>
//test
public class TestHibernate { private ApplicationContext act; private SessionFactory factory; @Before public void init(){ act = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); factory= act.getBean("sessionFactory",SessionFactory.class); } //测试 无 中间表的 N:1 关系 @Test public void test1() { Session session=factory.getCurrentSession(); Transaction tx=session.beginTransaction(); Person p=new Person(); p.setAge(12); p.setName("Yeeku"); Address address=new Address(); address.setAddressdesc("北京海淀区"); p.setAddress(address); //持久化对象 session.persist(p); session.flush(); tx.commit(); //如果不是使用的SessionFactory.getSession()来获得Session。 //而是使用SessionFactory.getCurrentSession()方法来获得Session时, //当事务结束的时候,不管是提交还是回滚事务,hibernate会自动关闭Session的, //session.close(); } //测试 无 中间表的 N:1 关系 @Test public void test2() { Session session=factory.getCurrentSession(); Transaction tx=session.beginTransaction(); Person p=new Person(); p.setAge(12); p.setName("Yeeku"); Address address=new Address(); address.setAddressdesc("北京海淀区"); p.setAddress(address); //持久化对象 session.persist(p); //修改 Person的 地址 Address address1=new Address(); address1.setAddressdesc("上海虹口"); p.setAddress(address1); tx.commit(); } }
注意:cascade="all"
<!--如果Person配置--> <hibernate-mapping package="com.sh.study.model"> <class name="Person" table="PERSON"> <id name="pid" type="java.lang.Integer" column="PID"> <generator class="increment"/> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="age" type="int"> <column name="AGE" /> </property> <!--如果少了 下面这个 cascade="all" --> <!-- 基于外键的 单向 1:1 注意 cascade--> <!-- unique="true" 表示 N 的一端必须是 唯一即可 这样就变成 单向 1:1 --> <many-to-one name="address" unique="true" class="Address" column="address_id"> </class> </hibernate-mapping>
会出现异常:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sh.study.model.Address
大小: 75.3 KB
大小: 84 KB
大小: 79.2 KB
查看图片附件
相关文章推荐
- Hibernate 关系映射(6) 基于中间表关联的单向1:N
- Hibernate 关系映射(五) 基于主键关联的单向1:1
- Hibernate 关系映射(三) 基于外键关联的单向 1:1
- Hibernate 关系映射(7) 基于外键关联的单向1:N
- Hibernate学习笔记-----关系映射(2)单向1-1关联
- Hibernate关系映射(六)多对多单向关联@ManyToMany Annotation方式
- Hibernate关系映射(8)_一对多单向关联
- Hibernate 映射关系 ---Many2Many 单向关联
- Hibernate之对象关系映射07一对一多单向关联
- Hibernate实体关系映射:单向主键一对一关联
- Hibernate之对象关系映射02一对一单向主键关联
- Hibernate关系映射1:单向N-1关联
- Hibernate关系映射(一) 基于外键的单向一对一
- Hibernate教程04_关系映射之一对一单向外键关联
- Hibernate关系映射(10)_多对多单向关联
- 【hibernate框架】关系映射之一对一单向外键关联(XML实现)
- Hibernate学习随笔-----关系映射(3)单向1-N关联
- Hibernate几种关系映射总结(单向关联)
- Hibernate关系映射(单向关联)
- Hibernate之对象关系映射01一对一单向关联