1.单向 1:1 基于主键关联
想象下 小康社会: 每家都有钱, 住起了小洋房 ,洋房编号: xx村2-36
eg: 一个地方有 一个人住.或者说 一家人住
eg: 每个同学家庭请了单独家教老师, 这样 1 对 1 的辅导
(在 原本N 变成了 1 的一端进行配置)
1 (N) 1
Person : Address
Student : Teacher
注意:基于主键关联,说的是Person表中id的值是Address表中的id
person
address
//test
如果一个地址 被多个person引用,此时会出问题,因为Person表中出现有多个相同的id
想象下 小康社会: 每家都有钱, 住起了小洋房 ,洋房编号: xx村2-36
eg: 一个地方有 一个人住.或者说 一家人住
eg: 每个同学家庭请了单独家教老师, 这样 1 对 1 的辅导
(在 原本N 变成了 1 的一端进行配置)
1 (N) 1
Person : Address
Student : Teacher
注意:基于主键关联,说的是Person表中id的值是Address表中的id
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;
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"> <!-- 基于主键的 1:1 --> <id name="pid" type="java.lang.Integer" column="PID"> <generator class="foreign" > <param name="property">address</param> </generator> </id> <one-to-one name="address" cascade="all"/> <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);
}
//修改 Person的地址
@Test
public void test1() {
try {
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多家了一条数据,但是person的地址没有改变,也就是id没有变
Address address1=new Address();
address1.setAddressdesc("上海虹口");
p.setAddress(address1);
session.flush();
System.out.println(p.getAddress().getAddressdesc());
Person pp=(Person)session.load(Person.class,1);
System.out.println(pp.getAddress().getAddressdesc());
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
//修改person的地址信息,此时修改Address对象就没有问题
@Test
public void test2() {
try {
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.setAddressdesc("上海虹口");
session.flush();
System.out.println(p.getAddress().getAddressdesc());
Person pp=(Person)session.load(Person.class,1);
System.out.println(pp.getAddress().getAddressdesc());
tx.commit();
// 发现 地址是重新添加入了一个 此时数据库中有两个Address 一个 Person有以前的地址1 变成了 2
} catch (Exception e) {
e.printStackTrace();
}
}
//同一个地址添加两个人会报错
@Test
public void test3() {
try {
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.setAddressdesc("上海虹口");
//如果一个地址添加了多个人 就会报错
/*Person p1=new Person();
p1.setAge(21);
p1.setName("luck");
p1.setAddress(address);
session.persist(p1);*/
session.flush();
System.out.println(p.getAddress().getAddressdesc());
Person pp=(Person)session.load(Person.class,1);
System.out.println(pp.getAddress().getAddressdesc());
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果一个地址 被多个person引用,此时会出问题,因为Person表中出现有多个相同的id
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.sh.study.model.o2o.Person#2]
