0

我需要将@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

4 回答 4

2

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

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

于 2013-02-12T03:40:05.770 回答
1

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

于 2013-02-12T13:41:43.817 回答
0

@Transactional如果您使用默认设置,则不需要注释包装器方法 。中的PROPAGATION设置@Transactional定义了事务范围。默认传播设置为PROPAGATION_REQUIRED.

有关详细信息,请参阅此处

于 2013-02-12T01:12:02.067 回答
0

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

于 2013-02-12T01:55:56.393 回答