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

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

阅读更多
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




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]


  • 大小: 26 KB
  • 大小: 20.5 KB
  • 大小: 252 KB
分享到:
评论

相关推荐

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

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

    Hibernate 关联关系映射分类

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

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

    总结来说,Hibernate中的一对一主键关联映射允许两个实体共享同一个主键,实现单向关联时只需在依赖方添加对另一方的引用。在实际应用中,应根据业务需求谨慎选择关联类型,以确保数据的完整性和一致性。

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。

    Hibernate关联映射

    2. Hibernate 一对一主键单向关联: 一对一主键关联是通过共享主键实现的,这意味着两个实体类共用同一个主键。在这种情况下,被引用的实体类(如 Address)不再有自己的独立主键生成策略,而是依赖于引用它的实体...

    hibernate 主键一对一映射(单向) 实例(java类)

    5. **配置Hibernate映射文件**:虽然在JPA中可以直接使用注解进行配置,但在一些情况下,你可能还需要为每个实体创建对应的Hibernate XML映射文件,以进一步自定义映射细节。 6. **数据操作**:在实际应用中,你...

    hibernate主键实现一对一单向关联关系源码

    本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...

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

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

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

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

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

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

    hibernate的关联关系映射

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

    hibernate一对一主键关联代码实现

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是常见的关系映射类型,它用于表示两个实体之间一对一的依赖关系。本教程将详细解释如何通过代码实现Hibernate的一对一主键关联。 首先,我们需要理解一对...

    hibernate实体关联关系映射

    ### Hibernate实体关联关系映射详解 #### 一、引言 Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,...

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

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

    Hibernate关联关系映射目录

    ### Hibernate关联关系映射 #### 一、单向关联 单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 ...

    hibernate一对一主键关联(注解版)

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它能够将数据库中的数据与Java对象进行映射,简化了数据库操作。本知识点主要讲解的是使用Hibernate实现一对一主键关联(Primary Key ...

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

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

Global site tag (gtag.js) - Google Analytics