ORM框架
实体Entity,具有ORM元数据的领域对象,POJO是实体的条件:
元素;实体共有4种状态:
GenerationType中定义几种可以供选择的策略:
TemporalType枚举中定义三种时间类型:
InheritanceType定义3种映射策略:
SINGLE_TABLE:父子类都保存在同一个表中,通过字段值进行区分。
JOINED:父子类相同的部分保存在同一个表中,不同的部门分开存放,通过连接不同的表获取完整数据。
TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。
JPA的参考实现,Hibernate主要有三个组件:hibernate-annotation、hibernate- entitymanager和hibernate-core。
hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括标准的JPA annotation以及Hibernate自身特殊功能的annotation。
hibernate-core是Hibernate的核心实现,提供核心功能。
hibernate-entitymanager实现标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。
HibernatePersistence实现JPA的PersistenceProvider接口,提供 createEntityManagerFactory和createContainerEntityManagerFactory两个方法来创建 EntityManagerFactory对象,这两个方法底层都是调用的EJB3Configuration对象的 buildEntityManagerFactory方法,来解析JPA配置文件persistence.xml,,并创建 EntityManagerFactory对象。
EntityManagerFactory对象的实现是EntityManagerFactoryImpl类,这个类有一个最重要的属性就是Hibernate的核心对象之一SessionFactory。这个类最重要的方法是createEntityManager,来返回 EntityMnagaer对象,而sessionFactory属性也传入了该方法。
EntityManager对象的实现是EntityManagerImpl类,这个类继承自AbstractEntityManagerImpl 类,在AbstractEntityManager类中有一个抽象方法getSession来获得Hibernate的Session对象,正是在这个 Session对象的实际支持下,EntityManagerImpl类实现了JPA的EntityManager接口的所有方法,并完成实际的ORM操 作。
此外,hibernate-entitymanager包中还有QueryImpl类利用EntityManagerImpl的支持实现了JPA的 Query接口;TransactionImpl利用EntityManagerImpl的支持实现了JPA的EntityTransaction接口。
JPA是规范,实现有Hibernate和Spring Data JPA。
Spring Data作为SpringSource的其中一个子项目,旨在统一和简化对各类型持久化存储和访问,而不拘泥于是关系型数据库还是NoSQL数据存储,使得对数据库的访问变得方便快捷,并支持MapReduce框架及云计算服务;对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBC、ORM的支持一样,Spring Data会让数据的访问变得更加方便,极大提高开发效率。
spring-data包括很多不同数据库的工程,如Redis,neo4j。
示例:
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
@Query("from User u where u.name=:name")
User findUser(@Param("name") String name);
}
只需要通过编写一个继承自JpaRepository的接口就能完成数据访问。
特性:通过解析方法名创建查询。另外,提供通过使用@Query来创建查询,需要编写JPQL语句,并通过类似“:name”来映射@Param指定的参数。@Query默认不支持原生态sql,需要用nativeQuery=true
开启。
还有诸如@Modifying操作、分页排序、原生SQL支持以及与Spring MVC的结合使用。
Repository子接口
接口 | 用途 |
---|---|
CrudRepository extends Repository |
实现CRUD相关方法 |
PagingAndSortingRepository extends CrudRepository |
实现分页排序相关方法 |
JpaRepository extends PagingAndSortingRepository |
实现JPA规范相关方法 |
其他:
@RepositoryDefinition(domainClass=实体类.class,idClass=主键类型.class)
where firstname like (parameter bound with appended %)
where firstname like (parameter bound with prepended %)
;where firstname like (parameter bound wrapped in %)
;Spring-data-jpa依赖于Hibernate:spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop
其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:
spring data jpa 提供方便快捷的查询数据库方式,只要按照它的约定,编写接口和函数定义,即可很方便的从数据库中查询到想用的数据。但是每个应用业务逻辑的复杂度不同,有时候是必须要自己定义JPQL甚至native sql 来做自己的查询。
public interface CustomizedLogRepository {
List<LogDto> searchLogs(String appId, String keyword);
long searchLogCount(String appId, String keyword);
}
public interface LogRepository extends CrudRepository<LogDto, Integer>, CustomizedLogRepository {
}
public class LogRepositoryImpl implements CustomizedLogRepository {
@Autowired
@PersistenceContext
private EntityManager entityManager;
@Override
public List<Ankonlog> searchLogs(String appId, String keyword) {
}
@Override
public long searchLogCount(String appId, String keyword) {
}
}
至此,自定义JPQL查询完成。
Spring Data JPA 自定义查询