Spring Data JPA - 参考文档-4

5.杂项

5.1。在自定义实现中使用JpaContext

在使用多个EntityManager实例和自定义存储库实现时,您需要确保将正确的连线EntityManager插入到存储库实现类中。这可以通过EntityManager@PersistenceContext注释中明确命名来解决,或者@QualifierEntityManager注入通过的情况下使用@Autowired

从Spring Data JPA 1.9开始,我们提供了一个JpaContext允许EntityManager通过托管域类获取的类,假设它只由EntityManager应用程序中的一个实例管理

例107.在自定义存储库实现中使用JpaContext
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基于名称自动合并持久性单元实现。

例108.使用MergingPersistenceUnitmanager
<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必须像这样配置:

例子109.使用ClasspathScanningPersistenceUnitPostProcessor
<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生产者EntityManagerFactoryEntityManager

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 ]

表8.属性
名称 描述

base-package

定义在自动检测模式下用于扩展* Repository库(实际接口由特定的Spring Data模块确定)的库接口。在配置的软件包下面的所有软件包也将被扫描。通配符是允许的。

repository-impl-postfix

定义后缀以自动检测自定义存储库实现。名称以配置的后缀结尾的类将被视为候选。默认为Impl

query-lookup-strategy

确定要用于创建查找器查询的策略。详细信息请参阅查询查询策略默认为create-if-not-found

named-queries-location

定义查找包含外部定义的查询的属性文件的位置。

consider-nested-repositories

控制是否应考虑嵌套存储库接口定义。默认为false

附录B:Poppers命名空间参考

<populator />元素

<populator />元素允许通过Spring Data存储库基础结构填充数据存储。4 ]

表9.属性
名称 描述

locations

在哪里可以找到从存储库中读取对象的文件。

附录C:存储库查询关键字

支持的查询关键字

下表列出了Spring Data存储库查询派生机制通常支持的关键字。但是,请参阅特定于商店的文档以获取受支持关键字的确切列表,因为在此列出的某些商店可能不受支持。

表10.查询关键字
逻辑关键字 关键字表达式

AND

And

OR

Or

AFTER

After, IsAfter

BEFORE

Before, IsBefore

CONTAINING

ContainingIsContainingContains

BETWEEN

Between, IsBetween

ENDING_WITH

EndingWithIsEndingWithEndsWith

EXISTS

Exists

FALSE

False, IsFalse

GREATER_THAN

GreaterThan, IsGreaterThan

GREATER_THAN_EQUALS

GreaterThanEqual, IsGreaterThanEqual

IN

In, IsIn

IS

IsEquals(或没有关键字)

IS_EMPTY

IsEmpty, Empty

IS_NOT_EMPTY

IsNotEmpty, NotEmpty

IS_NOT_NULL

NotNull, IsNotNull

IS_NULL

Null, IsNull

LESS_THAN

LessThan, IsLessThan

LESS_THAN_EQUAL

LessThanEqual, IsLessThanEqual

LIKE

Like, IsLike

NEAR

Near, IsNear

NOT

Not, IsNot

NOT_IN

NotIn, IsNotIn

NOT_LIKE

NotLike, IsNotLike

REGEX

RegexMatchesRegexMatches

STARTING_WITH

StartingWithIsStartingWithStartsWith

TRUE

True, IsTrue

WITHIN

Within, IsWithin

附录D:存储库查询返回类型

支持的查询返回类型

下表列出了Spring Data存储库通常支持的返回类型。但是,请参阅特定于商店的文档以获取支持的返回类型的确切列表,因为此处列出的某些商店可能不受支持。

地理空间类型,如(GeoResultGeoResultsGeoPage)只适用于支持地理空间查询的数据存储。
表11.查询返回类型
返回类型 描述

void

表示没有返回值。

基元

Java基元。

包装类型

Java包装类型。

T

一个独特的实体。期望查询方法最多返回一个结果。如果没有找到结果null被返回。不止一个结果会触发一个IncorrectResultSizeDataAccessException

Iterator<T>

一个Iterator

Collection<T>

Collection

List<T>

List

Optional<T>

Java 8或番石榴Optional期望查询方法最多返回一个结果。如果没有找到Optional.empty()Optional.absent()返回结果。不止一个结果会触发一个IncorrectResultSizeDataAccessException

Option<T>

无论是Scala还是JavaSlang Option类型。语义上与Optional上述Java 8相同

Stream<T>

Java 8 Stream

Future<T>

Future期望方法被注释@Async并且要求启用Spring的异步方法执行能力。

CompletableFuture<T>

Java 8 CompletableFuture期望方法被注释@Async并且要求启用Spring的异步方法执行能力。

ListenableFuture

org.springframework.util.concurrent.ListenableFuture期望方法被注释@Async并且要求启用Spring的异步方法执行能力。

Slice

大小的数据块与信息是否有更多的数据可用。需要一个Pageable方法参数。

Page<T>

Slice附加信息,例如结果总数。需要一个Pageable方法参数。

GeoResult<T>

结果输入附加信息,例如到参考位置的距离。

GeoResults<T>

GeoResult<T>附加信息列表,例如到参考位置的平均距离。

GeoPage<T>

PageGeoResult<T>,例如平均距离的参考位置。

附录E:常见问题

共同

  1. 我想获得更详细的日志记录信息,内部调用哪些方法JpaRepository,例如,我如何获得它们?

    你可以使用CustomizableTraceInterceptorSpring提供的:

    <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>

基础设施

  1. 目前我已经实现了一个基于HibernateDaoSupportSessionFactory用Spring 创建了一个AnnotationSessionFactoryBean如何让Spring Data存储库在这个环境中工作?

    必须更换AnnotationSessionFactoryBeanHibernateJpaSessionFactoryBean如下:

    Example 110.从HibernateEntityManagerFactory查找一个SessionFactory
    <bean id="sessionFactory" class="org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean">
      <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

审计

  1. 我想使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值