首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以将@Transactional注释放置到实体类中吗?

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

Stack Overflow用户
提问于 2017-03-16 15:24:52
回答 1查看 1.2K关注 0票数 2

我正在使用Spring和Hibernate框架尝试活动记录模式。下面是对这种模式的描述:

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

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

代码语言:javascript
运行
复制
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类:

代码语言:javascript
运行
复制
@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实体类:

代码语言:javascript
运行
复制
@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注解。

代码语言:javascript
运行
复制
public UserDao(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}
public void save(User user) {
    sessionFactory.getCurrentSession().save(user);
}

为什么?

更新

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-16 15:39:40

不,@Transactional由Spring管理,而@Entity则由Hibernate管理。

Hibernate bean不是由Spring管理的,也不是由@Transactional注释包装的。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42838263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档