我正在使用Spring 3.1.1.RELEASE,Hibernate 4.1.0.Final,JPA 2.0和MySQL 5.5我在Spring应用程序上下文文件中定义了事务,如下所示:
<jee:jndi-lookup jndi-name="java:jboss/springboard/sbpersistence" id="entityManagerFactory"
expected-type="javax.persistence.EntityManagerFactory" />
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:jta-transaction-manager />
我有一个Spring服务类,它有以下方法:
@Service
@Transactional
public class UserServiceImpl implements UserService
{
@Override
public User create(String firstName,
String middleName,
String lastName,
String userName,
String password,
String url,
Role role,
Organization org,
final Set<Contract> contracts)
{
…
return userDao.save(user);
}
@Override
public User createSampleUser(String firstName,
String middleName,
String lastName,
String userName,
String password,
String url,
Role role,
State state,
List<Product> products,
Date activationDate,
Date expirationDate)
{
…
return create(firstName,
middleName,
lastName,
userName,
password,
url,
role,
sampleDistrict,
contracts);
}
请注意,第二个方法调用第一个服务方法。我的问题是什么是适当的注释,如果有的话,表明我希望第二种方法中的所有内容都被视为原子工作单元?我很困惑,因为我的第一种方法是@Transactional。
谢谢, - 戴夫
答案 0 :(得分:0)
基于评论的更新
您可以使用create()
:
REQUIRED
方法
@Override
@Transactional(propagation = Propagation.REQUIRED)
public User create(String firstName,
String middleName,
String lastName,
String userName,
String password,
String url,
Role role,
Organization org,
final Set<Contract> contracts)
{
…
return userDao.save(user);
}
REQUIRED
表示如果有当前事务,它将使用同一事务。否则,它将为要执行的方法创建一个新事务。REQUIRED
的javadoc:
支持当前事务,如果不存在则创建新事务。类似于同名的EJB事务属性。这是事务注释的默认设置。
根据javadoc的最后一条评论,这是默认的事务传播设置,所以从技术上讲你不应该需要注释,但我几乎总是把它放在一边以便它清楚(也包括默认的更改!)