Java 我可以将@Transactional注释放在实体类中吗?

Java 我可以将@Transactional注释放在实体类中吗?,java,spring,hibernate,activerecord,transactional,Java,Spring,Hibernate,Activerecord,Transactional,我正在尝试使用Spring和Hibernate框架的模式。以下是此模式的说明: 对象同时携带数据和行为。这些数据大部分是持久性的,需要存储在数据库中。Active Record使用最明显的方法,将数据访问逻辑放在域对象中。这样,所有人都知道如何在数据库中读写数据 因此,我删除了传统的服务类,并将其逻辑和@Transactional注释移动到实体类。但是当我再次运行应用程序时,抛出了以下异常 org.hibernate.HibernateException: Could not obtain tr

我正在尝试使用Spring和Hibernate框架的模式。以下是此模式的说明:

对象同时携带数据和行为。这些数据大部分是持久性的,需要存储在数据库中。Active Record使用最明显的方法,将数据访问逻辑放在域对象中。这样,所有人都知道如何在数据库中读写数据

因此,我删除了传统的
服务
类,并将其逻辑和
@Transactional
注释移动到实体类。但是当我再次运行应用程序时,抛出了以下异常

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:133)
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:454)
    weibo.datasource.UserDao.save(UserDao.java:17)
    weibo.domain.User.register(User.java:32)
    weibo.web.UserController.register(UserController.java:29)
源代码

UserController
类:

@PostMapping("/users/register")
public String register(@RequestParam("username") String username,
                       @RequestParam("password") String password) {
    User user = new User(userDao, username, password);
    user.register();
    return "redirect:/users/login";
}
用户
实体类:

@Entity
@Table(name="USERS")
@Transactional
public class User {
    @Id
    @GeneratedValue
    private int id;
    private String name;
    private String password;

    @Transient
    private UserDao userDao;

    public User() {}
    public User(UserDao userDao, String username, String password) {
        ...
    }

    public void register() {
        userDao.save(this);
    }
}
UserDao
类。无
@Transactional
注释

public UserDao(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}
public void save(User user) {
    sessionFactory.getCurrentSession().save(user);
}
为什么?

更新


正如@cristianhh所说,
@Transactional
注释必须在Spring管理的bean中使用。但是,实体类不是。

否,
@Transactional
由Spring管理,
@entity
由Hibernate管理

Hibernate bean不由Spring管理,也不可分别由
@Transactional
注释包装


但是,您可以在服务/存储库层中使用
@Transactional
,并包装发送实体的数据访问对象(DAO)的函数。

否@Transactional必须在您的UserDao类上。@EssexBoy在传统的
控制器服务DAO
实现中,最好将此注释添加到
Service
类,而不是
Dao
类。请看另一个问题:我将注释移动到
UserController
类,但引发了相同的异常。为什么?当然这不是一个好的做法,我只是想知道源代码方面的原因。@walsh是您的
UserController
类,标记了
@Controller
注释?是的。我将
@Controller
添加到注释
UserController
类中。