gpt4 book ai didi

java - 我可以将@Transactional 注释放置到实体类吗?

转载 作者:行者123 更新时间:2023-11-30 06:49:21 25 4
gpt4 key购买 nike

我正在尝试 Active Record使用 Spring 和 Hibernate 框架的模式。下面是这个模式的描述:

An object carries both data and behavior. Much of this data is persistent and needs to be stored in a database. Active Record uses the most obvious approach, putting data access logic in the domain object. This way all people know how to read and write their data to and from the database.

因此,我删除了传统的 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 由 Spring 管理,@Entity 由 Hibernate 管理。

Hibernate bean 不由 Spring 管理,并且分别不能被 @Transactional 注释包装。

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

关于java - 我可以将@Transactional 注释放置到实体类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com