【发布时间】:2017-03-16 15:24:52
【问题描述】:
我正在尝试使用 Spring 和 Hibernate 框架的Active Record 模式。下面是对这种模式的描述:
一个对象同时携带数据和行为。这些数据大部分是持久的,需要存储在数据库中。 Active Record 使用最明显的方法,将数据访问逻辑放在域对象中。这样,所有人都知道如何在数据库中读取和写入数据。
所以,我删除了传统的Service 类,并将其逻辑和@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";
}
User 实体类:
@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-Managed bean 中使用。但是实体类不是。
【问题讨论】:
-
不,@Transactional 必须在您的 UserDao 类中。
-
@EssexBoy 在传统的
Controller-Service-Dao实现中,最好将此注解添加到Service类而不是Dao类。请看stackoverflow.com/questions/1079114/…
标签: java spring hibernate activerecord transactional