2014-02-25 58 views
0

我有一種困境。我正在使用spring-security-acl和他們的jdbc實現。問題是,我在其他查詢中使用JPA存儲庫(Spring-data-jpa)。我認爲,這是沒有問題,因爲JPA實現:使用JPA的Spring ACL,但ACL impl是JD​​BC。兩種方式

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

所以我在這JPA媒體鏈接數據源,它是用彈簧安全直接使用JDBC沒有問題。

但問題是在交易

我使用

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

但春天的ACL JDBC想

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource"/> 
    </bean> 

當我想實現ACL到我的項目,我:

@Transactional 
@PreAuthorize("permitAll") 
public Room createRoom(Integer roomID) { 
    // TODO Auto-generated method stub 
    createAcl(roomID); 
    return roomRepository.save(roomID); 

} 

,但我使用@Transactional

org.springframework.orm.jpa.JpaTransactionManager

代替JDBC

org.springframework.jdbc.datasource.DataSourceTransactionManager

不經常但有時我有:

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.createObjectIdentity(JdbcMutableAclService.java:152) 
    at org.springframework.security.acls.jdbc.JdbcMutableAclService.createAcl(JdbcMutableAclService.java:107) 
    at cz.services.RepositoryRoomService.createAcl(RepositoryRoomService.java:118) 

我沒有transacitons對JDBC的深的知識,所以會有任何問題補充

org.springframework.jdbc.datasource.DataSourceTransactionManager

,有兩個事務管理器? 還有另一種選擇是寫我自己的acl服務而不是JdbcMutableAclService。但使用jdbc則更容易。

<beans:bean id="aclService" 
     class="org.springframework.security.acls.jdbc.JdbcMutableAclService"> 
     <beans:constructor-arg ref="dataSource" /> 
     <beans:constructor-arg ref="lookupStrategy" /> 
     <beans:constructor-arg ref="aclCache" /> 
    </beans:bean> 

可以請別人告訴我什麼更好?

或者在JPA中使用JDBC並不是很好的解決方案,只能使用其中的一種技術? 感謝答案

+0

JpaTransactionManager應該同時適用於JPA和JDBC。 – holmis83

回答

1

我建議不要在事務性管理使用相同的transactionManager的名字,可以考慮改變其中的一個

<beans:bean id="transactionManager" 

<beans:bean id="transactionManagerJPA" 

然後

@Transactional("transactionManagerJPA") 

ID或考慮標記你與方法@TransactionalAttribute(TransactionAttributeType.REQUIRES_NEW)

+0

嗨,謝謝你的回答,但我不使用transactionManager,只有JPA。某些時候交易已關閉(在某些情況下)。我嘗試寫我自己的JPAMutableAclService。或者你有更快更簡單的解決方案? – Daris