Hibernate 关系映射(三) 基于外键关联的单向 1:1

1.单向 1:1 基于外键的
想象下 小康社会: 每家都有钱, 住起了小洋房 ,洋房编号:  xx村2-36

eg:  一个地方有 一个人住.或者说 一家人住
eg:  每个同学家庭请了单独家教老师, 这样 1 对 1 的辅导
(在 原本N 变成了 1 的一端进行配置) 

1 (N)          1
Person   : Address
Student  : Teacher


注意:这样在Person中会多一列 对address_id 的外键引用列 只是此时变成  unique=true 唯一 然Person 变成了唯一.
Pesron




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...
}



# 基于外键的 person address 1:1的
DROP TABLE IF EXISTS mytest.person;

CREATE TABLE mytest.person
	(
	PID        INT NOT NULL,
	NAME       VARCHAR (255),
	AGE        INT,
	address_id INT,
	PRIMARY KEY (PID),
	UNIQUE KEY address_id (address_id),
	KEY FK8C768F55E6A03022 (address_id),
	CONSTRAINT FK8C768F55E6A03022 FOREIGN KEY (address_id) REFERENCES address (AID)
	);

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">
	<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">
	</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);
	}
	//测试 基于外键关联的单向 1: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();
	}
	
	//测试 基于外键关联的单向 1: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


  • 大小: 102.6 KB
  • 大小: 74.4 KB
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值