Spring包装方法上的@Transactional用法

时间:2013-02-12 00:27:45

标签: spring hibernate transactions transactional

我是否需要在第二种方法中添加@Transactional注释?我想不是,但真的不确定。

@Transactional
public void addUser(User u) {
    u.setCreationDate(new Date());
    userDAO.addUser(u);
}

// should I add @Transactional annotation here?
public User addUser(String name, String surname) {
    User user = new User();
    user.setName(name);
    user.setSurname(surname);
    this.addUser(user);
    return user;
}

// DAO method
public void addUser(User u) {
    entityManager.persist(u);
}

4 个答案:

答案 0 :(得分:2)

您需要将@Transactional注释添加到public User addUser(String name, String surname)方法,否则该方法将以非事务方式执行。

@Transactional使用代理机制来实现事务支持,只有当你从第二个对象调用方法时才会调用它(即如果你在同一个类中调用一个方法,它将不会通过代理系统,所以它将始终使用调用者事务运行。)

答案 1 :(得分:1)

两者都是不同的方法,因为签名是diff,因此需要添加@Transactional注释。 如你所知,spring正在研究代理对象

答案 2 :(得分:0)

如果使用默认值,则无需注释包装器方法 @Transactional次设置。 PROPAGATION中的@Transactional设置定义 交易范围。默认传播设置为PROPAGATION_REQUIRED

有关详细信息,请参阅here

答案 3 :(得分:0)

在你的情况下,它会产生类似的结果。不同之处在于,如果您在public User addUser(String name, String surname)上放置@Transactional,您将在事务的上下文中创建新用户。如果不这样做 - 只有在代码执行public void addUser(User u)

时才会启动事务