私は、SpringとHibernateフレームワークを使ってActive Recordパターンを試しています。以下はこのパターンの説明です:@Transactionalアノテーションをエンティティクラスに配置できますか?
オブジェクトはデータと動作の両方を持ちます。このデータの多くは永続的であり、データベースに格納する必要があります。 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("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
エンティティクラス:
@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);
}
なぜですか?
UPDATE
@cristianhhは@Transactional
アノテーションがSpring管理豆に使用されなければならない、と述べたように。しかし、エンティティクラスはそうではありません。
@TransactionalはあなたのUserDaoクラスになければなりません。 –
@EssexBoy従来の 'Controller-Service-Dao'実装では、このアノテーションを' Dao'クラスではなく 'Service'クラスに追加する方がよいでしょう。 http://stackoverflow.com/questions/1079114/where-does-the-transactional-annotation-belong – walsh