码迷,mamicode.com
首页 > 其他好文 > 详细

JPA EntitManager进阶

时间:2015-04-30 16:10:14      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:jpa ejb

上篇咱们简单介绍了JPA EntityManager的基本操作, 咱们今天接着,更深一层次的介绍EntityManager


1 级联操作

2 实体状态

数据同步

级联操作 

 1.1 持久化带关系和实体

 上次,我们只是持久了一个客户实体, 如果创建客户的时候,同样持久化客户所对应的地址实体,如何操作呢? JPA中提供了多种持久化带关系的实体

首先看以下客户与地址的关系

 技术分享

代码

Publicclass Customer implemets Serializable
{
//级联持久化
@OneToOne(cascade = CascadeType.PERSIST)
Private  Address address;
 
}

Cascade  ,当调用persist方法持久化客户实体时

cascade = CascadeType.PERSIST ,客户所关联的实体也自动时就化


  持久化客户实体


  customer.setAddress(address);
  em.persist(customer);

这样,只需要持久化客户实体,对应固定实体也将自动持久化了,而不需要持久化两次

 

实体属性及加载方式

实体一旦通过find 方法查询后,实体的属性可以有两种方式加载, 分别是 即时加载(EAGER)和惰性加载(LAZY,


fetch = FetchType.ELAZY懒加载

fetch = FetchType.EAGER 即时加载


对于LAZY加载,只有当使用该实体属性时,才执行查询的SQl ,将属性加载进来,如果不显示的调用,该属性用于也不会加载到客户实体中,而且当该实体具有多条数据,使用懒加载,容易造成频繁访问数据库,出现 N+1问题。若数据量少,该方式还是一个很好的选择,若以一种方式没有绝对的好或不好

 

1.2 更新实体关系


前面我们说道持久化带关系的实体内容时,了解到通过设置实体关系级联属性cascade 可以调用persist方法自动持久化实体关系, 同样对于更新实体锁对应关系,也是使用的。 merge方法同时更新实体对应的关系实体

 

Publicclass Customer implemets Serializable
{
//级联更新设置
@OneToOne(cascade = CascadeType.MERGE)
Private  Address address;
 
}

此时客户端可以通过首先查找客户实体,通过get set 方式对地址实体进行修改,即可实现客户地址的修正。

 

 Cusetomer customer = cuseomerBean.findById("UUID");
 customer.geteAddress.setZip("056000");
 cuseomerBean.updateEntity(customer);

当调用merge方法, 实体管理器不仅检查客户实体是否修改i啊,也检查锁关联的地址实体,若为瞬时态,自动持久化,然后保存,若为托管,则更新到数据中。例如:新创建一个地址实体,也是可以持久化的

  Cusetomer customer = cuseomerBean.findById("UUID");
 Address address = new Address();
 address.setZip("056000");
 customer.setAddress(address);
 cuseomerBean.updateEntity(customer);

方法操作的背后还是要看现象的,不然理解起来不知所然呀


2 实体状态

一个实体从创建到销毁经历了多个状态,EntityManager是如果管理这些实体的,现在咱们就揭开这个面纱吧

通常有这样几个状态  瞬时态 transient), 托管 managed)以及销毁(Removed),与Hibernate大相径庭

 

 技术分享

举例说明:

瞬时态: 对象未保存数据库中,通过NEW对象,在内存中,为持久化

持久态:相对瞬时态,调用persist,保存在数据库中

托管态(Managed):是由上下文(persistence Contexgts)管理,是实体处于上下文可被管理的范围内。

游离太: 相对托管态,实体不在上下文中时,处于游离态,

   游离太情况:

  •  事务结束,实体超出作用域
  •  复制实体或序列化,实体处于游离态
  •   调用clear ,是有实体都处于游离态

     销毁态

  实体从数据库中删除后,处于销毁状态,但必须是在托管状态下删除,否则抛出异常


3 数据同步

 也许你会认为,当调用persist merge mremove 方法时,就已经将实体保存到数据库中,但事实并不是这样的,这些方法知识改变了实体所处的状态,最终保存到数据库中,使用的是flush方法

何时使用该方法何时呢,这需要了解flush提交的方式 ,默认是

AUTO自动调教, 实体管理器根据事务结束后,会调用flush方法,

设置模式是

 

Publicenum FLushModeType{
 
AUTO;
COMMIT
}


总结:

认识了实体管理器的级联操作 和生命周期管理后,对期有了基本的概念,同时对一些关系的设置也有了感官,整体上有了一个提升,下篇 晋升高级

 

JPA EntitManager进阶

标签:jpa ejb

原文地址:http://blog.csdn.net/han_yankun2009/article/details/45395271

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!