SpringDataJPA强制CGLib代理到非存储库类

SpringDataJPA强制CGLib代理到非存储库类,spring,spring-data,spring-data-jpa,Spring,Spring Data,Spring Data Jpa,我正在尝试将现有的Spring3JPA2HibernateWeb应用程序迁移到SpringDataJPA。 但是,只需将最新的Spring数据JPA添加到Maven项目中,并按照以下方式配置Spring数据 <jpa:repositories base-package="myapp.persistence.spring" entity-manager-factory-ref="entityManagerFactory" transaction-manager-r

我正在尝试将现有的Spring3JPA2HibernateWeb应用程序迁移到SpringDataJPA。 但是,只需将最新的Spring数据JPA添加到Maven项目中,并按照以下方式配置Spring数据

<jpa:repositories 
    base-package="myapp.persistence.spring" 
    entity-manager-factory-ref="entityManagerFactory"
    transaction-manager-ref="transactionManager" />
注意,Spring数据被配置为扫描包
myapp.persistence.Spring
,而上面的错误引用了包
myapp.persistence
中的类。当我将CGlib添加到项目中时,包括Spring数据在内的所有内容都可以正常工作。但是发生了什么?我是一个春季新秀,相当困惑。我无法理解Spring数据是如何发挥其代理魔力的。至少官方的例子根本不包括CGlib。进一步资料:

CompanyRepository
是一个使用EntityManager自制的简单JPA-DAO:

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public class CompanyRepository extends AbstractRepository<Company, Long> {
  …
}
部署到Tomcat 7.0.27中,如使用
激活用
@Repository
注释的SpringBean的持久性异常转换中所述。从
@Repository
开始,注释的主要目的是例外翻译,它将应用于使用注释的组件。如果您的类实现了一个接口,那么可以使用普通的JDK代理。如果没有,就像您的情况一样,需要CGLib来创建代理。更多详情请参阅

要在不使用CGLib的情况下使用
,您在场景中基本上有两种选择:

  • 为每个用
    @Repository
    注释的组件引入一个接口。这将仍然应用持久性异常转换,这可能是您想要的
  • 首先不要使用
    @Repository
    ,而是使用
    @Component
    基本上禁用这些组件的异常转换
  • @Repository
    @Transactional(propagation = Propagation.MANDATORY)
    public class CompanyRepository extends AbstractRepository<Company, Long> {
      …
    }
    
    <tx:annotation-driven proxy-target-class="true" mode="aspectj"/>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>