2014-02-27 1 views
1

봄 보안 ACL에서 JPA를 사용할 수 있습니다. jdbc 구현 만 볼 수 있습니다. 여기에 콩 내 JPA 설정입니다 :JPA with Spring 보안 ACL

<beans:bean id="producerService" class="cz.services.RepositoryProducerService" /> 
<jpa:repositories base-package="cz.repository" /> 

<beans:bean id="myEmf" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <beans:property name="dataSource" ref="dataSource" /> 
    <beans:property name="packagesToScan" value="cz.models" /> 
    <beans:property name="jpaVendorAdapter"> 
     <beans:bean 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </beans:property> 
    <beans:property name="jpaProperties"> 
     <beans:props> 

      <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect 
      </beans:prop> 
      <beans:prop key="hibernate.show_sql">true</beans:prop> 
     </beans:props> 
    </beans:property> 
</beans:bean> 

<beans:bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <beans:property name="entityManagerFactory" ref="myEmf" /> 
</beans:bean> 

<beans:bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <beans:property name="url" 
     value="jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=UTF-8" /> 

    <beans:property name="username" value="root" /> 
    <!--<property name="password" value="test" /> --> 
    <beans:property name="password" value="test1"></beans:property> 
</beans:bean> 

하지만 대신 org.springframework.orm.jpa.JpaTransactionManager 사용 beacuse 나는, 트랜잭션 매니저에 문제가 :

org.springframework.jdbc.datasource.DataSourceTransactionManager합니다.

주된 문제는 acl 작성을 시작할 때 예외 트랜잭션이 실행 중이어야하고, 두 번째 시도 (다시 broswer에서 시도하고 다시 시도)가 괜찮습니다.

java.lang.IllegalArgumentException: Transaction must be running 
    at org.springframework.util.Assert.isTrue(Assert.java:65) 
    at org.springframework.security.acls.jdbc.JdbcMutableAclService.createOrRetrieveSidPrimaryKey(JdbcMutableAclService.java:218) 
    at org.springframework.security.acls.jdbc.JdbcMutableAclService$1.setValues(JdbcMutableAclService.java:135) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:899) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:890) 

사람이 나를 도울 수있다 : 여기

은 첫 번째 시도에서 오류가? 감사합니다

답변

1

문제가 해결되었습니다!

이 트랜잭션 관리자는 내에서 작업 트랜잭션 (즉, 일반 JDBC 코드를 직접 데이터 소스 액세스를 지원합니다 : :)

나는 봄 JPA 트랜잭션 매니저가

봄 3의의 JavaDoc에서 미리보기가 해당 검색 동일한 데이터 소스로). JPA에 액세스하는 혼합 서비스와 이 (JPA를 인식하지 않고) 일반 JDBC를 사용하는 서비스를 허용합니다!

하지만 문제는 내 CGLIB에 있었다 - 나는

<tx:annotation-driven transaction-manager="transactionManager" />

를 사용하여 인터페이스 JPA 저장소에서 @Transactional을 제거해야합니다.

는 나도 여기에 해결책을 발견 : What transaction manager should I use for JBDC template When using JPA ?

희망 누군가가 도움이됩니다.