JPA EntitManager进阶
上篇我们简单介绍了JPA EntityManager的基本操作,我们今天接着,更深1层次的介绍EntityManager。
1 级联操作1.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);
这样,只需要持久化客户实体,对应固定实体也将自动持久化了,而不需要持久化两次
实体属性及加载方式 实体1旦通过find方法查询后,实体的属性可以有两种方式加载,分别是 即时加载(EAGER)和惰性加载(LAZY),
fetch = FetchType.ELAZY懒加载 fetch = FetchType.EAGER即时加载
对LAZY加载,只有当使用该实体属性时,才履行查询的SQl,将属性加载进来,如果不显示的调用,该属性用于也不会加载到客户实体中,而且当该实体具有多条数据,使用懒加载,容易造成频繁访问数据库,出现 N+1问题。若数据量少,该方式还是1个很好的选择,若以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啊,也检查锁关联的地址实体,若为瞬时态,自动持久化,然后保存,若为托管,则更新到数据中。例如:新创建1个地址实体,也是可以持久化的 Cusetomer customer = cuSEOmerBean.findById("UUID");
Address address = new Address();
address.setZip("056000");
customer.setAddress(address);
cuSEOmerBean.updateEntity(customer); 方法操作的背后还是要看现象的,不然理解起来不知所然呀
2 实体状态1个实体从创建到烧毁经历了多个状态,EntityManager是如果管理这些实体的,现在我们就揭开这个面纱吧 通常有这样几个状态 瞬时态(transient),托管(managed)和烧毁(Removed),与Hibernate大相径庭
举例说明: 瞬时态:对象未保存数据库中,通过NEW对象,在内存中,为持久化 持久态:相对瞬时态,调用persist,保存在数据库中 托管态(Managed):是由上下文(persistence Contexgts)管理,是实体处于上下文可被管理的范围内。 游离太:相对托管态,实体不在上下文中时,处于游离态, 游离太情况:
烧毁态 实体从数据库中删除后,处于烧毁状态,但必须是在托管状态下删除,否则抛出异常
3 数据同步或许你会认为,当调用persist,merge或mremove方法时,就已将实体保存到数据库中,但事实其实不是这样的,这些方法知识改变了实体所处的状态,终究保存到数据库中,使用的是flush方法 什么时候使用该方法什么时候呢,这需要了解flush提交的方式,默许是 AUTO自动调教,实体管理器根据事务结束后,会调用flush方法, 设置模式是
Publicenum FLushModeType{
AUTO;
COMMIT
}
总结:认识了实体管理器的级联操作和生命周期管理后,对期有了基本的概念,同时对1些关系的设置也有了感官,整体上有了1个提升,JPA EntityManager高级
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |