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

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
分享到:
评论

相关推荐

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

    在一对一唯一外键关联映射中,单向关联意味着一个实体知道另一个实体,而另一个实体对此关系无感知。通过在映射文件中配置`one-to-one`标签,我们可以方便地在Java对象和数据库表之间建立和维护这种关系。在实际开发...

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

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

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

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

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射是指两个实体之间的关联关系,其中一个实体作为外键,另一个实体作为关联目标。这种关联方式可以分为单向关联和双向关联两种。 单向关联是指一个实体作为外键,关联到另一个...

    hibernate一对一唯一外键关联映射(单项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理数据库中的唯一外键关联时。这种映射方式允许在一个实体类中引用另一个实体类的唯一实例,形成一对一的关系。在...

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

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

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

    总结起来,Hibernate Annotation提供了一种直观、方便的方式来实现对象关系映射,包括基于外键的多对一关联。通过在Java类上添加特定的注解,我们可以让Hibernate自动管理数据的持久化,从而简化开发工作。在实践中...

    Hibernate一对一单向外键关联 (联合主键annotation)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是常见的关系映射类型,它用于表示两个实体之间存在唯一的对应关系。本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的...

    Hibernate 关联关系映射分类

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

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

    hibernate一对一之唯一外键关联(双向关联)

    本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...

    Hibernate 一对一外键单向关联

    总结起来,Hibernate中的一对一外键单向关联提供了方便的方式处理两个实体之间的关系。通过注解或XML配置,我们可以轻松地在Java对象和数据库表之间建立映射,使得数据操作更加简洁和高效。不过,需要注意的是,这种...

    Hibernate一对一单向外键关联(annotation/xml)

    本篇将深入探讨Hibernate中的一对一单向外键关联,通过注解和XML配置两种方式进行实现。这种关联允许一个实体类与另一个实体类之间存在一对一的关系,并且只在其中一个实体类中维护这种关系。 首先,我们来理解一对...

    Hibernate关联映射

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

    hibernate一对一之唯一外键关联(单向关联)

    总的来说,Hibernate的一对一唯一外键关联(单向关联)是通过在一方实体中定义另一方实体的引用,并通过注解或XML映射文件进行配置来实现的。这种关联方式简化了对象关系的管理,但同时也需要开发者在操作关联对象时...

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

    以上就是关于Hibernate外键实现一对一单向关联关系的详细说明。这个知识点涉及到数据库设计、ORM框架的使用,以及Java编程实践,对于理解和使用Hibernate进行数据库操作具有重要意义。在实践中,应结合具体业务场景...

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

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

    hibernate的关联关系映射

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

Global site tag (gtag.js) - Google Analytics