`
Luob.
  • 浏览: 1588585 次
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate 关系映射(四) 基于中间表关联的单向1:1

阅读更多
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
分享到:
评论

相关推荐

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的关联关系,...

    Hibernate 关联关系映射分类

    综上所述,Hibernate提供了丰富的关联关系映射机制,包括一对一、一对多和多对多关联,每种关联又可以细分为单向和双向,以及基于主键和基于外键的不同实现方式。正确理解和选择合适的关联关系对于构建高效、可维护...

    Hibernate教程04_关系映射之一对一单向外键关联

    这个文件名暗示了这是一组基于Spring、Struts和Hibernate(简称S2SH)的示例代码,具体涉及的是关系映射中的一对一单向外键关联。"uni_fk"表示单向(unidirectional)外键(foreign key)关联。在数据库中,外键用于...

    Hibernate关联映射

    1. Hibernate 一对一外键单向关联: 在 Hibernate 中,一对一的外键单向关联意味着一个实体类中的属性指向另一个实体类,而另一个实体类并不知道这个关联。这种关联可以通过在 `many-to-one` 元素中添加 `unique=...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    Hibernate_实体关联关系映射--学习总结

    实体关联关系映射涉及一对一、一对多、多对多等多种形式,而这些映射方式又可以分为单向和双向,依据使用的是主键还是外键,以及是否使用连接表。接下来,我们详细介绍这些知识点。 ###Hibernate实体关联关系映射...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

    Hibernate教程10_关系映射之多对一单向关联

    本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...

    Hibernate关联关系映射目录

    -- 映射关联PO,column是Address在该表中的外键列名,增加unique变成“1-1” --&gt; &lt;/hibernate-mapping&gt; ``` --- ##### 2. 一对一主键单向关联 在一对一主键单向关联中,两个实体共享同一个主键。这种方式通常...

    Hibernate基于连接表的一对多单向关联

    标题 "Hibernate基于连接表的一对多单向关联" 涉及的是数据库对象关系映射(ORM)框架Hibernate中的一个重要概念。在Java开发中,Hibernate是广泛使用的工具,它允许开发者将Java类与数据库表进行映射,简化了数据...

    hibernate 单向多对多关联映射练习

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

    Hibernate教程11_关系映射之一对多单向关联

    本教程主要探讨的是Hibernate中的一种重要关系映射类型:一对多单向关联。在关系型数据库中,一对多关联是最常见的关系类型,一个实体可以与多个其他实体相关联。在Hibernate中,这种关系可以通过配置XML映射文件或...

    hibernate一对多关联映射(单向关联)

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    hibernate的关联映射

    在Hibernate中,关联映射是实现对象关系映射(ORM)的关键,它允许我们在对象模型和关系数据库之间建立联系。关联映射主要包括四种类型:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对...

    Hibernate教程06_关系映射之一对一单向主键关联

    这个文件名可能代表了一个基于Struts2、Spring和Hibernate(S2SH)的项目,其中"relation03"可能表示关系映射的第三部分,而"one2one_uni_pk"直指一对一单向主键关联的具体实现。 **详细知识点:** 1. **一对一...

    Hibernate一对一唯一外键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型在对象模型中的体现。这种关联通常用于表示两个实体之间非常特殊的联系,比如一个人只有一个身份证,或者一个公司只有一个总部...

Global site tag (gtag.js) - Google Analytics