首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在设置对象的值时将其持久化

在设置对象的值时将其持久化
EN

Stack Overflow用户
提问于 2011-05-04 02:20:17
回答 3查看 1.8K关注 0票数 1

我是一个全新的JPA+Hibernate+Spring新手(但我对Spring framework for web application和SQL有相当多的经验),所以我的问题可能不是在JPA中使用正确的技术术语。

我有一个典型的User POJO,它是用javax.persistence.*注释的,我已经根据我发现的例子设置了hibernate+hsqldb,目前运行良好。User类如下所示:

代码语言:javascript
复制
@Entity
@Table(name = "USER")
public class User {

    private Long id;
    private String name;
    // Ignore id getter and setter methods

    @Column(name = "USER_NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

这是我的UserDAOImpl类。

代码语言:javascript
复制
public class UserDAOImpl implements UserDAO {

    private HibernateTemplate hibernateTemplate;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    @Override
    public void saveUser(User user) {
        hibernateTemplate.saveOrUpdate(user);
    }

    // This method is made to return only one User object.
    @Override
    @SuppressWarnings("unchecked")
    public User getGiUser() {
        return hibernateTemplate.find("from User where User_Name ='gi'").get(0);
    }
}

通过使用getGiUser方法,我可以从数据库中获取持久对象(如果我理解正确的话)。我的问题是,是否可以使User.setName()方法在被调用时立即提交到数据库,而不必手动保存它?我应该如何或从哪里开始或学习这方面的知识?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-04 02:37:21

据我所见,您正在寻找一个调用UserDAO的服务bean:

代码语言:javascript
复制
public class UserServiceImpl implements UserService {
    private UserDAO userDao;    // injected by Spring

    @Transactional
    public void changeUserName(String name) {
        User user = userDao.getGiUser();
        user.setName(name);
        // I can't remember if this saveUser() call is required, or if
        // Hibernate will automatically pick up the changes and save the 
        // user object
        userDao.saveUser(user);
    }
}

@Transactional来自这里:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/transaction.html

此外,使用HibernateTemplate不再是使用Hibernate的首选方式。Spring文档的这一部分展示了如何使用直接的Hibernate代码:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/orm.html

实际上,您可能更喜欢使用Hibernate作为Spring的JPA2提供者;ORM章节(上面)也展示了如何将JPA与Spring集成。Hibernate仍然可以继续作为您的JPA2提供者。这样,您就可以将所有代码与Spring和Hibernate解耦,只需使用带有EntityManager的标准JPA2批注。

票数 2
EN

Stack Overflow用户

发布于 2011-05-04 02:38:31

您可以使用拦截机制来实现这一点。事实是,更改必须保存在代码行的某处,但您的User类不是一个很好的保存位置,因此您可以在其他地方编写代码,并使用拦截或面向方面的机制,使用Spring等应用程序框架来监视正在调用的方法,并在调用特定方法(如setName)时保存类的状态。

下面是hibernate和spring集成的an example

票数 1
EN

Stack Overflow用户

发布于 2011-05-04 03:02:22

当您从会话中获取用户(使用session.get()session.load()、关联遍历或HQL或Criteria查询)时,将在提交周围事务时提交对用户所做的任何更改(不需要调用saveupdatesaveOrUpdatemerge )。它不会立即写入数据库(刷新),但会在必要时写入数据库:在提交之前,或者在执行其结果可能取决于刷新的查询之前。你通常不需要关心。

如果您所说的“提交到数据库”是指从事务性提交的角度进行提交,那么这是不可能的。当周围的事务被提交时,就会提交更改。

如果您希望在当前事务之外提交特定的更新,则需要在另一个事务中进行更新,使用BobG的答案中的代码,但使用@Transactional(propagation = Propagation.REQUIRES_NEW)注释。

也许你应该更准确地解释你想做什么,以及你为什么要这么做。

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

https://stackoverflow.com/questions/5873899

复制
相关文章

相似问题

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