序言 这几天研究了下JPA的标准查询,名为:JPA criteria查询.相比JPQL,其优势是类型安全,更加的面向对象. 使用标准查询,开发人员可在编译的时候就检查查询的正确与否。 更详细的,可以参考Jpa 2.0规范-动态查询Criteria Api JPA元模型概念,及使用 在JPA中,标准查询是以元模型的概念为基础的.元模型是为具体持久化单元的受管实体定义的.这些实体可以是实体类,嵌入类或者映射的父类.提供受管实体元信息的类就是元模型类. 描述受管类的状态和他们之间的关系的静态元模型类可以 1.从注解处理器产生 2.从程序产生 3.用EntityManager访问. 如下code,一个简单的实体类package com.demo.entities;下,实体类Employee ,假设该实体有诸如id,name和age的基本属性,还有与类Address的OneToMany关联: 实体类的标准元模型类的名字将是使用 javax.persistence.StaticMetamodel注解的Employee_。元模型类的属性全部是static和public的。Employee的每一个属性都会使用在JPA2规范中描述的以下规则在相应的元模型类中映射: 诸如id,name和age的非集合类型,会定义静态属性SingularAttribute b,这里b是定义在类A中的类型为B的一个对象。 对于Addess这样的集合类型,会定义静态属性ListAttribute b,这里List对象b是定义在类A中类型B的对象。其它集合类型可以是SetAttribute, MapAttribute 或 CollectionAttribute 类型。 以下是用注解处理器产生的元模型类package com.demo.entities;下: 就像它的名字表明的,注解处理器处理注解,帮助产生源代码。注解处理在编译时就能激活。元模型类遵循JPA2.0规范中为定义标准元模型类而描述的规则创建。 使用元模型类最大的优势是凭借其实例化可以在编译时访问实体的持久属性.该特性使得criteria 查询更加类型安全. 元模型API与Java中的标准反射API密切相关。主要不同在于使用标准反射API编译器无法验证其正确性。例如:下面的代码会通过编译测试: 编译器假定com.demo.Test中定义了属性myName,一旦该类并没有定义属性myName,编译器将抛出运行时异常。 元模型API会强制编译器检查适当的值是否分配给实体类的持久属性。例如:考虑Employee类的age属性,它是Integer变量。若该属性被赋值为String类型的值,编译器会抛出错误。该实现并不要求支持非标准特性。程序员编写的元模型类通常称为非标准元模型类。当EntityManagerFactory 创建时,持久化提供者会初始化元模型类的属性。 使用criteria 查询 为了更好的理解criteria 查询,考虑拥有Employee实例集合的Dept实体,Employee和Dept的元模型类的代码如下: 下面的代码片段展示了一个criteria 查询,它用于获取所有年龄大于24岁的员工: 对应的SQL: SELECT * FROM employee WHERE age > 24 构建CriteriaQuery 实例API说明 CroteriaQuery CriteriaQuery对象必须在实体类型或嵌入式类型上的Criteria 查询上起作用。它通过调用 […]
在springboot中,spring.jpa.open-in-view值是默认开启的 开启open-in-view的意义: 在事务外也可以访问懒加载的数据 hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。 把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现”Open Session in View”的模式。例如: 它允许在事务提交之后延迟加载显示所需要的对象。 OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。 采用Controller-Service-Dao三层结构,事务配置在Service层 使用前 使用后 Controller中的各Service独享Session Controller中的各Service共享Session Controller中的各Service独享一级缓存 Controller中的各Service共享一级缓存 Controller中通过Service查找的实体为游离状态 Controller中通过Service查找的实体为托管状态 Controller中通过Service查找的实体Lazy异常 Controller中通过Service查找的实体Lazy正常 Controller中通过Service查找的实体修改后不会同步到数据库 Controller中通过Service查找的实体修改后若存在可写事务则会同步到数据库 Controller中各Service事务独立 Controller中各Service事务独立 实现原理, 通过OpenEntityManagerInViewInterceptor这个拦截器处理, 他继承自 […]
并行流可提高效率。但针对jpa的懒加载。可能导致no session异常。需注意
若前端传排序字段。则为sort=weight,sequence,desc&sort=extra,asc&sort=id,desc 针对Spring Boot 2.1及之前 Sort sort = new Sort(Sort.Direction.DESC, “createdate”) .and(new Sort(Sort.Direction.AES, “id”)); Pageable pageable = new PageRequest(1, 10, sort) 针对Spring Boot 2.2及之后 var sort = Sort.by(Sort.Direction.DESC, “weight”, “sequence”) .and(Sort.by(Sort.Direction.ASC, “extra”)) .and(Sort.by(Sort.Direction.DESC, “id”)); var pageNumber = pageable.getPageNumber(); var pageSize = pageable.getPageSize(); return PageRequest.of(pageNumber, pageSize, sort);
Jakarta EE Bidirectional relationships must follow these rules. Unidirectional Relationships In a unidirectional relationship, only one entity has a relationship field or property that refers to the other. For example, LineItem would have a relationship field that identifies Product, but Product would not have a relationship field or property for LineItem. In other words, LineItem knows about Product, but Product doesn’t know which LineItem instances refer to it. […]
【在一切开始之前,我要先告诉大家:慎用级联关系,不要随便给all权限操作。应该根据业务需求选择所需的级联关系。否则可能酿成大祸。切记】 在理解不足时,慎用@OneToOne @OneToMany @ManyToOne @ManyToMany这几个注解。都说Jpa复杂,果然名不虚传。不恰当的使用。会带来各种问题。切记!!! CascadeType.PERSIST官方文档的说明:Cascade persist operation看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥有方实体时,也会持久保存该实体的所有相关数据。) 可以看到,我们在上面的代码中给了Student对Course进行级联保存(cascade=CascadeType.PERSIST)的权限。此时,若Student实体持有的Course实体在数据库中不存在时,保存该Student时,系统将自动在Course实体对应的数据库中保存这条Course数据。而如果没有这个权限,则无法保存该Course数据。 CascadeType.REMOVECascade remove operation,级联删除操作。删除当前实体时,与它有映射关系的实体也会跟着被删除。 CascadeType.MERGECascade merge operation,级联更新(合并)操作 CascadeType.DETACHCascade detach operation,级联脱管/游离操作。如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。 CascadeType.REFRESHCascade refresh operation,级联刷新操作。会重新查询数据库里的最新数据。类似级联查询。 CascadeType.ALLCascade all operations,清晰明确,拥有以上所有级联操作权限。