- 浏览: 1589940 次
- 来自: 上海
文章分类
- 全部博客 (374)
- Java (101)
- Struts (54)
- Oracle (30)
- JavaScript (16)
- Spring (27)
- Hibernate (16)
- MyEclipse (3)
- JSF (1)
- FreeMarker (2)
- SiteMesh (2)
- JfreeChart (2)
- Ibatis (2)
- JSP (12)
- MyBatis (4)
- SWFupload (1)
- EJB (4)
- Jboss (4)
- WebService (2)
- Linux (16)
- Android (2)
- XML (6)
- Java 网络编程 (13)
- AXIS2 (1)
- FTP (1)
- Jswing (1)
- Socket (3)
- 杂文选集 (6)
- solr (2)
- PS (1)
- Tomcat (7)
- JDBC (9)
- Highcharts (1)
- maven (1)
- Nodejs (0)
- navicat (2)
- Exception (5)
- eclipse (3)
- jQuery (1)
- springMVC (4)
- MySQL (11)
- SVN (1)
- Sql Server (1)
- zookeeper (1)
- JVM (1)
- Groovy (2)
- Git (1)
- Nginx (1)
- DynamicReport (1)
- IDEA (2)
- JasperReports (1)
- Postgresql (2)
- Mac (1)
- gradle (1)
- 数据结构算法 (1)
最新评论
-
hpu145:
引用引用
java 千分位的添加和去除 -
被遗忘的下路:
少了个junit-4.8.2的包
SSH2整合完整案例(四十三) -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
emoji 表情图片解决方法 -
caipeiming:
这个挺好JavaScript实现input输入框控件只允许输入 ...
js 控制文本框只能输入中文、英文、数字等 -
双子树:
东西太好啦受教啊
Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)
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]
发表评论
-
Hibernate的属性映射配置
2014-01-08 23:20 2173package com.crazyit.app.domai ... -
Hibernate 的初始化
2014-01-08 22:43 3555public static void main(Strin ... -
Hibernate 的关系与配置
2014-01-05 21:57 28171.单向 N:1 例如:一个地方有多个人住. (在1 的一端 ... -
Spring配置Hibernate事务
2013-11-10 13:45 1217为了保证数据的一致性,在编程的时候往往需要引入事务这个概念。事 ... -
Hibernate 关系映射(一)基于外键关联的N:1
2013-05-14 23:45 10191.单向 N:1 无中间表 例如:一个地方有多个人住. ... -
Hibernate 关系映射(二)基于中间表的N:1
2013-05-13 21:11 8191.单向 N:1 有中间表 例如:一个地方有多个人住. ... -
Hibernate 关系映射(三) 基于外键关联的单向 1:1
2013-05-03 23:42 9721.单向 1:1 基于外键的 想象下 小康社会: 每家都有钱, ... -
Hibernate 关系映射(四) 基于中间表关联的单向1:1
2013-05-02 20:07 11261.单向 1:1 基于中间表 想象下 小康社会: 每家都有钱, ... -
Hibernate 关系映射(6) 基于中间表关联的单向1:N
2013-03-21 17:55 973基于中间表关联的单向1:N 单向 1 对 N 关联,注意 和 ... -
Hibernate 关系映射(7) 基于外键关联的单向1:N
2013-03-21 00:31 868基于中间表关联的单向1:N 单向 1 对 N 关联,注意 和 ... -
Hibernate 缓存
2012-11-12 00:46 33401数据缓存:(date caching) ... -
Hibernate 的HQL,QBC 查询语言
2012-11-11 17:25 187631.HQL:(Hibernate Query Language ... -
HIbernate 关系映射配置
2012-11-11 02:10 21781.主键关联one-to-one 释义:两个表使用相同的主键 ... -
HIbernate 基础
2012-11-10 22:30 12571.标识符 表示符号生成器描述increment适用于代理主建 ... -
SSH2整合完整案例(四十三)
2012-09-14 09:34 20685注解配置:Struts2+Spring2.5+Hibernat ...
相关推荐
这个文件名可能代表了一个基于Struts2、Spring和Hibernate(S2SH)的项目,其中"relation03"可能表示关系映射的第三部分,而"one2one_uni_pk"直指一对一单向主键关联的具体实现。 **详细知识点:** 1. **一对一...
综上所述,Hibernate提供了丰富的关联关系映射机制,包括一对一、一对多和多对多关联,每种关联又可以细分为单向和双向,以及基于主键和基于外键的不同实现方式。正确理解和选择合适的关联关系对于构建高效、可维护...
总结来说,Hibernate中的一对一主键关联映射允许两个实体共享同一个主键,实现单向关联时只需在依赖方添加对另一方的引用。在实际应用中,应根据业务需求谨慎选择关联类型,以确保数据的完整性和一致性。
在Java的持久化框架...总结来说,Hibernate的一对一主键关联映射,尤其是双向关联,能有效地简化对象关系的映射,提高代码的可读性和维护性。然而,需要根据实际情况权衡其带来的性能影响,确保系统设计的高效性。
2. Hibernate 一对一主键单向关联: 一对一主键关联是通过共享主键实现的,这意味着两个实体类共用同一个主键。在这种情况下,被引用的实体类(如 Address)不再有自己的独立主键生成策略,而是依赖于引用它的实体...
5. **配置Hibernate映射文件**:虽然在JPA中可以直接使用注解进行配置,但在一些情况下,你可能还需要为每个实体创建对应的Hibernate XML映射文件,以进一步自定义映射细节。 6. **数据操作**:在实际应用中,你...
本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...
“Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...
实体关联关系映射涉及一对一、一对多、多对多等多种形式,而这些映射方式又可以分为单向和双向,依据使用的是主键还是外键,以及是否使用连接表。接下来,我们详细介绍这些知识点。 ###Hibernate实体关联关系映射...
这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...
【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联是常见的关系映射类型,它用于表示两个实体之间一对一的依赖关系。本教程将详细解释如何通过代码实现Hibernate的一对一主键关联。 首先,我们需要理解一对...
### Hibernate实体关联关系映射详解 #### 一、引言 Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,...
在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型在对象模型中的体现。这种关联通常用于表示两个实体之间非常特殊的联系,比如一个人只有一个身份证,或者一个公司只有一个总部...
### Hibernate关联关系映射 #### 一、单向关联 单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 ...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它能够将数据库中的数据与Java对象进行映射,简化了数据库操作。本知识点主要讲解的是使用Hibernate实现一对一主键关联(Primary Key ...
本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...