我正在嘗試使用Spring和Hibernate框架的Active Record模式。以下是對這種模式的描述:我可以將@Transactional註釋放置到實體類嗎?
一個對象攜帶數據和行爲。大部分數據都是持久的,需要存儲在數據庫中。 Active Record使用最明顯的方法,將數據訪問邏輯放入域對象中。這樣,所有人都知道如何讀寫數據庫中的數據。
因此,我刪除了傳統的Service
類,並將其邏輯和@Transactional
註釋移至實體類。但是當我再次運行我的應用程序時,下面的異常被拋出。
@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
類:
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("https://stackoverflow.com/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
實體類。沒有@Transactional
註釋。
public UserDao(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void save(User user) {
sessionFactory.getCurrentSession().save(user);
}
爲什麼?
UPDATE
正如@cristianhh所說,@Transactional
註釋必須在Spring管理豆使用。但是,實體類不是。
否@Transactional必須位於您的UserDao類中。 –
@EssexBoy在傳統的Controller-Service-Dao實現中,最好將此註釋添加到「Service」類而不是「Dao」類。請參閱http://stackoverflow.com/questions/1079114/where-does-the-transactional-annotation-本身 – walsh