我有一種困境。我正在使用spring-security-acl和他們的jdbc實現。問題是,我在其他查詢中使用JPA存儲庫(Spring-data-jpa)。我認爲,這是沒有問題,因爲JPA實現:使用JPA的Spring ACL,但ACL impl是JDBC。兩種方式
<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並不是很好的解決方案,只能使用其中的一種技術? 感謝答案
JpaTransactionManager應該同時適用於JPA和JDBC。 – holmis83