`
mshijie
  • 浏览: 94706 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

@OneToOne 延迟加载

阅读更多

今天使用JPA(Hibernate)实现一个一对一关联的时候,发现无法使用延迟加载.Person关联一个Picture.在读取Person的时候,显示的记载了对于的Picture.读取10个Person发生了11次数据库查询.

 

最后查阅资料后,发现是自己对OneToOne理解不够透彻所致.之前的关联是这么定义的.

@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "Person
")
	private Picture picture;
}
 
@Entity
public class Picture {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@OneToOne
	private Person Person;

}

 主表是Picture,从表是Person.外键字段定义在Picture表中.在这种情况下.读取Person会现实的读取Picture.

 

因为如果延迟加载要起作用,就必须设置一个代理对象.但是Personn可以不关联一个Picture,如果有Picture关联就设置为代理对象延迟加载,如果不存在Picture就设置null,因为外键字段是定义在Picture表中的,Hibernate在不读取Picture表的情况是无法判断是否关联有Picture,因此无法判断设置null还是代理对象,统一设置为代理对象,也无法满足不关联的情况,所以无法使用延迟加载,只有显示读取Picture.

 

原因找到了.做了如下修改

@Entity
public class Person {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	private Picture picture;
}
 
@Entity
public class Picture {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@OneToOne(mappedBy = "picture)
	private Person Person;

}

修改了表的主从关系,这时外键字段定义在Personnel表中.Hibernate就可以在不读取Picture表的情况下根据外键字段设置null或者代理对象,延迟加载也就起作用了.

 

同样的道理,我们平时在使用一对多的情况是,多端是主表,因此可以通过外键字段判断进而设置代理对象或者null.而在一端,虽然Hibernate无法判断是否关联有对象.但是即使不关联对象时也不应该设置为null,而应该设置为一个空的List或者Map,那么Hibernate就可以通过代理这个List或者Map实现延迟加载.这也是为什么,我们在设置一端关联时,一般显式的new一个ArrayList或者HaskMap,如:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "personnel")
private List<Reward> rewards = new ArrayList<Reward>();

这就是为了避免使用null表示没有关联,和使用空的List一致.

1
0
分享到:
评论

相关推荐

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

    NULL 博文链接:https://zhouhaitao.iteye.com/blog/1171227

    Hibernate one to one 实例

    Hibernate one to one 源码!有注释

    hibernate 关联映射(二) one to one(单向)

    NULL 博文链接:https://selvemen.iteye.com/blog/459102

    Hibernate注解

    fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载 * 方法一 使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用...

    spring-jpa-hibernate:使用Spring Data JPA和Hibernate作为JPA提供者的示例应用程序

    查找映射集合的大小,而不必加载集合中的所有元素 多个EntityManager 在单个应用程序中使用多个EntityManager 手动标识符生成 手动生成实体标识符 和 JTA交易 使用Bitronix支持跨多个数据存储的JTA事务 带有...

    JPA 标注 JPA标签手册

    o @OneToOne o @OrderBy • P o @PersistenceContext o @PersistenceContexts o @PersistenceProperty o @PersistenceUnit o @PersistenceUnits o @PrimaryKeyJoinColumn o @PrimaryKeyJoinColumns • Q o @...

    hibernate_onetoone实例

    里面是hibernate 一对一的例子,里面有数据库,是用oracle连接的,把脚本生成一下就可以了.

    mybatis20190102oneToOne

    该文件为我的博客“Mybatis注解方式实现一对一,一对多的关联查询”(链接:https://blog.csdn.net/weixin_44003141/article/details/85686694)的源代码,欢迎下载查看。

    Hibernate_Annotation关联映射

    使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3)...

    详解Hibernate cascade级联属性的CascadeType的用法

    详解Hibernate cascade级联属性的CascadeType的用法 cascade(级联) ...cascade表示级联操作,在hibernate配置注解@OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的属性。 例如: @ManyToOne(c

    Spring中的基础知识

    JPA Java 持久化 API,是官方定义的基于注解形式的技术规范, 进行对象关系映射(ORM),对象与表的映射,对象之间的关系与表之间关系的映射 封装了 JDBC 操作(在其基础之上) ...@OneToOne // 一对多

    Hibernate_Course

    Hibernate课程 在这个资料库中,我尝试学习Hibernate 话题 简单的结局 预先映射 @OneToOne @OneToMany @多多 提取类型 懒惰的 渴望的

    hibernate_onetoone.part4.rar

    hibernate_onetoone.part4.rar

    hibernate_onetoone.part5.rar

    hibernate_onetoone.part5.rar

    hibernate_onetoone.part3.rar

    第三部分hibernate_onetoone.part3共5部分 。全部下载需要10分

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany讲解,代码示例,数据库示例!非常全面

    hibernate_onetoone.part2.rar

    hibernate_onetoone.part2.rar &lt;br&gt;共5部分。 需要全部才能解压

    SpringBoot-SpringData-oneToOne

    SpringBoot-SpringData-oneToOne,博文:http://blog.csdn.net/ABAP_Brave/article/details/52845986

    lecture3_jpa_associations

    例如@ManyToOne、@OneToMany 和@OneToOne。 实现了这些注释的单向和双向变体。 嵌入式数据库服务器是使用 Apache Derby 实现的。 单元测试允许验证关联集合的获取以及对关联集合的插入和更新的级联 配置是基于 ...

    oneToMany-OneToOne-search.zip

    oneToMany-OneToOne-search,xml方式、注解方式实现一对一查询、一对多查询,、注解方式实现一对一查询、一对多查询、注解方式实现一对一查询、一对多查询

Global site tag (gtag.js) - Google Analytics