设置对象时保持其值

时间:2011-05-03 18:20:17

标签: java hibernate spring jpa persistence

我是JPA + Hibernate + Spring的新手(但我对使用Spring框架的Web应用程序和SQL有相当多的经验)所以我的问题可能没有在JPA中使用正确的技术术语。

我有一个典型的User POJO,用javax.persistence.*注释,我根据我发现的目前工作正常的例子设置了hibernate + hsqldb。 User类看起来像这样:

@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课程。

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()方法在调用时立即提交到数据库,而不必手动保存它?我应该如何或在哪里开始或了解这一点?

3 个答案:

答案 0 :(得分:2)

从我所看到的,你正在寻找一个调用UserDAO的服务bean:

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的JPA 2提供程序; ORM章节(上面)还展示了如何将JPA与Spring集成。 Hibernate仍然可以继续成为您的JPA 2提供商。这样您就可以将所有代码与Spring和Hibernate分离,只需将标准JPA 2注释与EntityManager一起使用。

答案 1 :(得分:1)

您可以使用拦截机制来实现此目的。事实上,变更必须保存在某个地方,但是你的User类不是一个好的地方,所以你可以在其他地方编写代码并使用像{{3}这样的应用程序框架使用拦截或面向方面的机制。监视被调用的方法以及调用特定方法(如setName)时保存类的状态。

这是hibernate和spring integration的Spring

答案 2 :(得分:1)

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

如果通过“提交到数据库”,你的意思是在事务提交方面提交,那么它是不可能的。提交周围事务时将提交更改。

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

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