5.杂项
5.1。在自定义实现中使用JpaContext
在使用多个EntityManager
实例和自定义存储库实现时,您需要确保将正确的连线EntityManager
插入到存储库实现类中。这可以通过EntityManager
在@PersistenceContext
注释中明确命名来解决,或者@Qualifier
在EntityManager
注入通过的情况下使用@Autowired
。
从Spring Data JPA 1.9开始,我们提供了一个JpaContext
允许EntityManager
通过托管域类获取的类,假设它只由EntityManager
应用程序中的一个实例管理。
class UserRepositoryImpl implements UserRepositoryCustom {
private final EntityManager em;
@Autowired
public UserRepositoryImpl(JpaContext context) {
this.em = context.getEntityManagerByManagedType(User.class);
}
…
}
这种方法的优点是,在域类型被分配给不同的持久性单元的情况下,不需要触摸存储库来改变对持久性单元的引用。
5.2。合并持久性单元
Spring支持多个持久性单元开箱即用。然而,有时候,您可能需要模块化应用程序,但仍然要确保所有这些模块在运行时在单个持久性单元中运行。为此,Spring Data JPA提供了一个PersistenceUnitManager
基于名称自动合并持久性单元的实现。
<bean class="….LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitManager">
<bean class="….MergingPersistenceUnitManager" />
</property>
</bean>
5.2.1。类路径扫描@Entity类和JPA映射文件
一个普通的JPA设置需要列出所有注解映射实体类orm.xml
。这同样适用于XML映射文件。Spring Data JPA提供了一个ClasspathScanningPersistenceUnitPostProcessor,它可以获取一个基本包,并且可以选择一个映射文件名模式。然后,它将扫描给定的包中用@Entity或@MappedSuperclass注解的类,并加载匹配文件名模式的配置文件,并将它们交给JPA配置。PostProcessor必须像这样配置:
<bean class="….LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitPostProcessors">
<list>
<bean class="org.springframework.data.jpa.support.ClasspathScanningPersistenceUnitPostProcessor">
<constructor-arg value="com.acme.domain" />
<property name="mappingFileNamePattern" value="**/*Mapping.xml" />
</bean>
</list>
</property>
</bean>
从Spring 3.1开始,可以在LocalContainerEntityManagerFactoryBean上直接配置要扫描的软件包,以启用实体类的类路径扫描。有关详细信息,请参阅JavaDoc。 |
5.3。CDI整合
版本库接口的实例通常由一个容器创建,在使用Spring Data时,Spring是最自然的选择。有一些复杂的支持,可以轻松设置Spring来创建创建存储库实例中记录的bean 实例。从版本1.1.0开始,Spring Data JPA附带了一个自定义CDI扩展,允许在CDI环境中使用存储库抽象。该扩展是JAR的一部分,所以您只需要将Spring Data JPA JAR放入类路径即可。
现在,您可以设置基础结构通过实施为一个CDI生产者EntityManagerFactory
和EntityManager
:
class EntityManagerFactoryProducer {
@Produces
@ApplicationScoped
public EntityManagerFactory createEntityManagerFactory() {
return Persistence.createEntityManagerFactory("my-presistence-unit");
}
public void close(@Disposes EntityManagerFactory entityManagerFactory) {
entityManagerFactory.close();
}
@Produces
@RequestScoped
public EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory.createEntityManager();
}
public void close(@Disposes EntityManager entityManager) {
entityManager.close();
}
}
根据您运行的JavaEE环境,必要的设置可能会有所不同。EntityManager
如下所示,重新声明CDI bean 也可能足够了:
class CdiConfig {
@Produces
@RequestScoped
@PersistenceContext
public EntityManager entityManager;
}
在这个例子中,容器必须能够创建JPA EntityManagers
本身。所有的配置都是将JPA重新导出EntityManager
为CDI bean。
Spring Data JPA CDI扩展将挑选所有可用的EntityManagers作为CDI bean,并在容器请求存储库类型的bean时创建Spring Data repository的代理。因此获得一个Spring数据仓库的实例是一个声明一个@Injected
属性的问题:
class RepositoryClient {
@Inject
PersonRepository repository;
public void businessMethod() {
List<Person> people = repository.findAll();
}
}
附录
附录A:命名空间参考
<repositories />元素
该<repositories />
元素触发了Spring Data存储库基础设施的设置。最重要的属性是base-package
定义用于扫描Spring Data repository接口的包。[ 3 ]
名称 | 描述 |
---|---|
| 定义在自动检测模式下用于扩展* Repository库(实际接口由特定的Spring Data模块确定)的库接口。在配置的软件包下面的所有软件包也将被扫描。通配符是允许的。 |
| 定义后缀以自动检测自定义存储库实现。名称以配置的后缀结尾的类将被视为候选。默认为 |
| 确定要用于创建查找器查询的策略。详细信息请参阅查询查询策略。默认为 |
| 定义查找包含外部定义的查询的属性文件的位置。 |
| 控制是否应考虑嵌套存储库接口定义。默认为 |
附录B:Poppers命名空间参考
<populator />元素
该<populator />
元素允许通过Spring Data存储库基础结构填充数据存储。[ 4 ]
名称 | 描述 |
---|---|
| 在哪里可以找到从存储库中读取对象的文件。 |
附录C:存储库查询关键字
支持的查询关键字
下表列出了Spring Data存储库查询派生机制通常支持的关键字。但是,请参阅特定于商店的文档以获取受支持关键字的确切列表,因为在此列出的某些商店可能不受支持。
逻辑关键字 | 关键字表达式 |
---|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
附录D:存储库查询返回类型
支持的查询返回类型
下表列出了Spring Data存储库通常支持的返回类型。但是,请参阅特定于商店的文档以获取支持的返回类型的确切列表,因为此处列出的某些商店可能不受支持。
地理空间类型,如(GeoResult ,GeoResults ,GeoPage )只适用于支持地理空间查询的数据存储。 |
返回类型 | 描述 |
---|---|
| 表示没有返回值。 |
基元 | Java基元。 |
包装类型 | Java包装类型。 |
| 一个独特的实体。期望查询方法最多返回一个结果。如果没有找到结果 |
| 一个 |
| 一 |
| 一 |
| Java 8或番石榴 |
| 无论是Scala还是JavaSlang |
| Java 8 |
| 一 |
| Java 8 |
| 一 |
| 大小的数据块与信息是否有更多的数据可用。需要一个 |
| A |
| 结果输入附加信息,例如到参考位置的距离。 |
| |
| 甲 |
附录E:常见问题
共同
-
我想获得更详细的日志记录信息,内部调用哪些方法
JpaRepository
,例如,我如何获得它们?你可以使用
CustomizableTraceInterceptor
Spring提供的:<bean id="customizableTraceInterceptor" class=" org.springframework.aop.interceptor.CustomizableTraceInterceptor"> <property name="enterMessage" value="Entering $[methodName]($[arguments])"/> <property name="exitMessage" value="Leaving $[methodName](): $[returnValue]"/> </bean> <aop:config> <aop:advisor advice-ref="customizableTraceInterceptor" pointcut="execution(public * org.springframework.data.jpa.repository.JpaRepository+.*(..))"/> </aop:config>
基础设施
-
目前我已经实现了一个基于
HibernateDaoSupport
。我SessionFactory
用Spring 创建了一个AnnotationSessionFactoryBean
。如何让Spring Data存储库在这个环境中工作?必须更换
AnnotationSessionFactoryBean
与HibernateJpaSessionFactoryBean
如下:Example 110.从HibernateEntityManagerFactory查找一个SessionFactory<bean id="sessionFactory" class="org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean"> <property name="entityManagerFactory" ref="entityManagerFactory"/> </bean>
审计
-
我想使用Spring Data JPA审计功能,但是我的数据库已经设置好,可以在实体上设置修改和创建日期。如何防止Spring Data以编程方式设置日期。
只需使用名称空间元素的
set-dates
属性auditing
为false即可。
附录F:术语表
-
AOP
-
面向方面的编程
Commons DBCP
-
Commons DataBase连接池 - Apache基础的库,提供DataSource接口的池实现。
CRUD
-
创建,读取,更新,删除 - 基本的持久性操作
DAO
-
数据访问对象 - 从持久化对象中分离持久逻辑的模式
依赖注入
-
从外部将组件的依赖关系传递给组件的模式,释放组件以查找依赖关系本身。更多信息请参阅http://en.wikipedia.org/wiki/Dependency_Injection。
的EclipseLink
-
实现JPA的对象关系映射器 - http://www.eclipselink.org
过冬
-
实现JPA的对象关系映射器 - http://www.hibernate.org
JPA
-
Java持久性API
弹簧
-
Java应用程序框架 - http://projects.spring.io/spring-framework