您的位置:首页 > 其它

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



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

查看图片附件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: