- 浏览: 1237434 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 103945myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之八:分页查询
2014-01-13 22:07 0分页查询:物理分页,不是内存分页: 1. 在sql语句中指定 ... -
myBatis系列之六:与SpringMVC集成
2013-12-26 13:33 5899myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之五:与Spring3集成
2013-12-09 14:31 4993myBatis系列之一:搭建开 ... -
myBatis系列之四:关联数据的查询
2013-12-08 13:36 9713myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之三:增删改查
2013-12-01 22:36 5038myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之二:以接口方式交互数据
2013-11-25 22:46 12365myBatis系列之一:搭建开发环境 myBatis系列之三: ... -
myBatis系列之一:搭建开发环境
2013-11-18 22:00 8542myBatis系列之二:以接口方式交互数据 myBatis系列 ... -
Hibernate 集合类型使用
2012-08-11 18:31 1339为了映射实体中的集合 ... -
Hibernate 组件关联关系
2012-08-11 15:10 1247实体关联的属性是个复杂类型的持久化类,但不是实体:数据库中没有 ... -
Hibernate 一对多关联配置
2012-08-09 22:13 1850以Department和Employee为例。 Depart ... -
Hibernate 继承关系配置
2012-08-08 23:33 4054以Department和Employee实体为例。Develo ... -
Hibernate 多对一关联配置
2012-08-08 21:51 28298实体是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 1412jdbc的批处理操作是指把一组SQL语句(增删改操作)一次性提 ... -
jdbc调用postgreSQL数据库内置函数
2012-05-08 16:02 31231. current_timestamp 返回的是当前的 ... -
构建Hibernate项目
2012-04-25 20:35 01. 新建一个Java Project 2. 添加hiber ... -
乐观锁与悲观锁
2012-04-24 22:50 2765悲观锁: 读取数据的时候对记录加锁,直到提交数据更新后解锁 ... -
Hibernate映射文件的配置
2012-04-20 22:21 01. type值不是指java类型或者数据库的类型,而是Hib ...
相关推荐
NULL 博文链接:https://1028826685.iteye.com/blog/1525683
12_JPA详解_JPA中的一对一双向关联.zip 12_JPA详解_JPA中的一对一双向关联.zip
使用学生(student)、老师(teacher)、班级(class)反映出Hibernate annotation JPA 的一对多、多对多、多对一的关联。或许对您有用
12_传智播客JPA详解_JPA中的一对一双向关联.rar
13_传智播客JPA详解_JPA中的多对多双向关联实体定义与注解设置.rar
JPA中的一对多双向关联与级联操作
这是本人观看传智的视频,整理出来的完整的源码,及学习步骤,学了总会忘记,方便今后复习。代码可以直接运行,jar包完整,资源较大,分几块分享(1-5,按照学习步骤写的)。
10_JPA详解_JPA中的一对多双向关联与级联操作.zip
JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询缓存 · 20. JPA视频_JPQL_ORDER BY 和 GROUP...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第12讲 JPA中的一对一双向关联.avi
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi
映射单向多对一、单向一对多、双向一对一、双向多对一和双向多对多关联关系的具体实现
10_传智播客JPA详解_JPA中的一对多双向关联与级联操作.rar
这是本人观看传智的视频,整理出来的完整的源码,及学习步骤,学了总会忘记,方便今后复习。代码可以直接运行,jar包完整,资源较大,分几块分享(1-5,按照学习步骤写的)。
Hibernate一对多使用非主键关联设置,参看详细说明
要是你对 Hibernate 或 TopLink 的 Criteria API 不熟悉的话,可以将它想像成一个以 Java 为中心的面向对象,线程安全并可以与 JPQL 划上等号的一组 API .这组 API 适合于编写复杂的动态查询语句,还可避免解析 JPQL...
基于JPA的Demo,包含关联(一对多等等),继承,主键(组合主键,主键生成策略),注解,基本类型的实现。
熟练使用JPA的关联映射 多对一,一对多单向 双向多对一关联 双向一对一关联 双向多对多关联 会使用JPA的二级缓存
Hibernate一对多关联双向关联代码实现分享,大家参考使用吧