- 浏览: 1249840 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
在一对一关联中,JPA没有规定谁为关系的维护方,OneToOne的mapped属性值指定了由另外一方实体的某个属性来维护一对一关联。以Person和IDCard为例。
Person类:
1. 测试保存
当IDCard的person属性的optional为true时,上面的idcard.setPerson(person)可以省略,因为Person既设置了级联属性cascade={CascadeType.ALL},在保存Person实体的时候也会保存IDcard,又是关系的维护方,在它们之间建立关联。如果为false,在先保存idcard时候,由于not null约束,程序报错。
2. 测试更新:
em.merge(idcard)可以省略,因为idcard已经是托管态了,对它的修改在commit的时候都会提交到数据库。如果idcard是游离态则需要该语句。
3. 测试查询:
因为IDCard实体的person属性设置了fetch=FetchType.EAGER,jpa会使用一个SELECT连表查询出Person和IDCard。
如果fetch设置为FetchType.LAZY,jpa会使用两个SELECT语句(第一个查询出IDCard,第二个连表查询),不会产生EntityManager关闭导致的问题。
4. 测试删除:
当IDCard的person属性的optional为true时,能删除成功;为false时删除会报错:org.hibernate.PropertyValueException: not-null property references a null or transient value: com.john.bean.Person.idcard
Person类:
@Entity @Table(name="pillow") public class Person { private Integer id; private String name; private IDCard idcard; public Person() { } public Person(String name) { this.name = name; } @Id @GeneratedValue public Integer getId() { return id; } @Column(length=20, nullable=false) public String getName() { return name; } @OneToOne(cascade={CascadeType.ALL},optional=false) // optional specified to false means the corresponding column couldn't be nullable @JoinColumn(name="idcard_id") // Indicate the column name of the foreign key public IDCard getIdcard() { return idcard; } // Setters are omitted }
@Entity public class IDCard { private Integer id; private String cardno; private Person person; public IDCard() { } public IDCard(String cardno) { this.cardno = cardno; } @Id @GeneratedValue public Integer getId() { return id; } @Column(length=18, nullable=false) public String getCardno() { return cardno; } // mappedBy specifies the property of the corresponding class that maintains the relationship. Also indicates this entity is the maintained edge. @OneToOne(mappedBy="idcard", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH}, optional=false, fetch=FetchType.EAGER) // Maintained edge public Person getPerson() { return person; } // Setters are omitted }
1. 测试保存
public void save() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator"); EntityManager em = factory.createEntityManager(); Person person = new Person("Johnson"); IDCard idcard = new IDCard("330818198602260444"); // idcard.setPerson(person); person.setIdcard(idcard); em.getTransaction().begin(); // It's mandatory to open transaction to insert, update or delete data. em.persist(person); em.getTransaction().commit(); em.close(); factory.close(); }
当IDCard的person属性的optional为true时,上面的idcard.setPerson(person)可以省略,因为Person既设置了级联属性cascade={CascadeType.ALL},在保存Person实体的时候也会保存IDcard,又是关系的维护方,在它们之间建立关联。如果为false,在先保存idcard时候,由于not null约束,程序报错。
2. 测试更新:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); IDCard idcard = em.find(IDCard.class, 1); idcard.setCardno("330624198802060168"); // em.merge(idcard); em.getTransaction().commit(); em.close(); factory.close();
em.merge(idcard)可以省略,因为idcard已经是托管态了,对它的修改在commit的时候都会提交到数据库。如果idcard是游离态则需要该语句。
3. 测试查询:
public void queryFromMaintained() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator"); EntityManager em = factory.createEntityManager(); IDCard idcard = em.find(IDCard.class, 1); em.close(); factory.close(); System.out.println(idcard.getCardno()); System.out.println(idcard.getPerson().getName()); }
因为IDCard实体的person属性设置了fetch=FetchType.EAGER,jpa会使用一个SELECT连表查询出Person和IDCard。
如果fetch设置为FetchType.LAZY,jpa会使用两个SELECT语句(第一个查询出IDCard,第二个连表查询),不会产生EntityManager关闭导致的问题。
4. 测试删除:
public void deleteFromMaintained() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); IDCard idcard = em.find(IDCard.class, 1); em.remove(idcard); em.getTransaction().commit(); em.close(); factory.close(); }
当IDCard的person属性的optional为true时,能删除成功;为false时删除会报错:org.hibernate.PropertyValueException: not-null property references a null or transient value: com.john.bean.Person.idcard
发表评论
-
myBatis系列之七:事务管理
2014-04-01 15:36 104049myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之八:分页查询
2014-01-13 22:07 0分页查询:物理分页,不是内存分页: 1. 在sql语句中指定 ... -
myBatis系列之六:与SpringMVC集成
2013-12-26 13:33 5967myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之五:与Spring3集成
2013-12-09 14:31 5057myBatis系列之一:搭建开 ... -
myBatis系列之四:关联数据的查询
2013-12-08 13:36 9778myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之三:增删改查
2013-12-01 22:36 5105myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之二:以接口方式交互数据
2013-11-25 22:46 12430myBatis系列之一:搭建开发环境 myBatis系列之三: ... -
myBatis系列之一:搭建开发环境
2013-11-18 22:00 8607myBatis系列之二:以接口方式交互数据 myBatis系列 ... -
Hibernate 集合类型使用
2012-08-11 18:31 1383为了映射实体中的集合 ... -
Hibernate 组件关联关系
2012-08-11 15:10 1306实体关联的属性是个复杂类型的持久化类,但不是实体:数据库中没有 ... -
Hibernate 一对多关联配置
2012-08-09 22:13 1887以Department和Employee为例。 Depart ... -
Hibernate 继承关系配置
2012-08-08 23:33 4098以Department和Employee实体为例。Develo ... -
Hibernate 多对一关联配置
2012-08-08 21:51 28358实体是Employee和Department,它们之间是多对一 ... -
Hibernate 查询分析
2012-08-08 19:15 0private void fireLoad(LoadEv ... -
Hibernate 配置文件
2012-07-25 20:17 0<properties> < ... -
jdbc 批处理操作
2012-05-15 15:43 1466jdbc的批处理操作是指把一组SQL语句(增删改操作)一次性提 ... -
jdbc调用postgreSQL数据库内置函数
2012-05-08 16:02 31721. current_timestamp 返回的是当前的 ... -
构建Hibernate项目
2012-04-25 20:35 01. 新建一个Java Project 2. 添加hiber ... -
乐观锁与悲观锁
2012-04-24 22:50 2828悲观锁: 读取数据的时候对记录加锁,直到提交数据更新后解锁 ... -
Hibernate映射文件的配置
2012-04-20 22:21 01. type值不是指java类型或者数据库的类型,而是Hib ...
相关推荐
在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...
**JPA 一对一关联关系源码详解** Java Persistence API (JPA) 是Java平台上的一个标准,用于管理和持久化对象到数据库。它提供了一种面向对象的方式来操作数据库,简化了数据库编程。在JPA中,一对一(OneToOne)...
本实例将详细探讨JPA中的一对一(OneToOne)关系配置,以及如何在实际项目中实现。 一对一关系在数据库设计中意味着两个实体之间存在一个实体对应另一个实体的唯一关系。例如,一个人可能只有一个护照,或者一个...
接下来,我们将深入探讨如何配置和使用JPA的一对一关联。 首先,我们需要创建两个实体类,例如`Person`和`Profile`。`Person`可能包含基本信息,如姓名和年龄,而`Profile`可能包含更详细的信息,如地址和电话号码...
本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...
双向的一对一关联则需要在两个实体上都进行配置,但只有一个方向是“拥有”关系,用`@OneToOne(cascade=CascadeType...)`来指定级联操作。 4. **一对多关联(JPAOneToMany)** 一对多关联意味着一个实体可以与多个...
**JPA 2 一对多双向关联关系** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式操作数据库。在JPA中,一对多关联关系是常见的实体间关系类型...
在Java Persistence API (JPA) 中,多对多(ManyToMany)关系是表示两个实体之间复杂关联的一种方式。这种关联允许一个实体实例可以与多个其他实体实例相关联,反之亦然。例如,一个学生可以选修多门课程,一门课程...
4. **注解细节**:`@JoinColumn`用于单向一对一或一对多关系,而在多对多关系中,通常使用`@JoinTable`来指定中间表的信息,包括表名、连接列等。 5. **操作关联**:在JPA中,可以通过添加或移除对象到集合属性来...
默认情况下,一对一关联是急加载,可以通过`@OneToOne(fetch = FetchType.LAZY)`设置为懒加载,以提高性能。 3. **数据一致性**:由于双向关联可能导致数据不一致,因此在处理关联关系时需要特别小心,确保两边的...
在一对一关联中,一个实体实例对应数据库中的唯一一行。这种关系可以用@OneToOne注解来表示,它可以是单向或双向的。例如,一个用户可能只有一个账户,账户实体和用户实体之间就是一对一的关系。可以通过设置mapped...
本资料主要探讨了JPA中的一对一双向关联,这是一个重要的概念,对于理解和优化数据模型设计至关重要。 一对一双向关联是指在两个实体类中,每个实体都可以直接引用对方,形成双向的关系。例如,一个学生可以对应一...
**JPA一对多和多对一关系详解** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式来操作数据库。在JPA中,实体间的关系映射是核心概念之一,...
本文将深入探讨 JPA 中的一对一 (One-to-One)、一对多 (One-to-Many)、多对一 (Many-to-One) 和多对多 (Many-to-Many) 的关联映射。 #### 二、实体关系映射概述 在领域模型中,实体间的关系可以是: - **一对一 ...
在Java Persistence API (JPA) 中,一对多关联是一种常见的关系映射,它表示一个实体可以与多个其他实体相关联。这种关联在数据库层面通常通过外键实现,而在JPA中,我们通过注解来配置这种关系。这篇博客将深入探讨...
在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...
本文主要探讨的是JPA中的`@OneToOne`注解,它用于建立两个实体之间的一对一关联关系。在实际开发中,这种关联关系常常出现在需要精确映射一对一实体映射的情况,例如用户与个人信息、车辆与车牌号等。我们将会深入...
1. **一对一关联(OneToOne)**:在实体之间,如果一个实体对应另一个实体的唯一实例,那么就存在一对一关联。在JPA中,可以使用`@OneToOne`注解来表示这种关系。然而,这段代码并未直接展示一对一关联的例子。 2. **...
一对一关联(OneToOne)在关系型数据库设计中是一种常见的实体关系模型,用于表示两个表之间的一种强关联,其中一张表的某条记录唯一对应另一张表的一条记录。这种关联通常通过外键(Foreign Key)来实现,确保数据...
本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...