我对JPA + Hibernate + Spring完全陌生(但是我对用于Web应用程序和SQL的Spring框架有相当的经验),所以我的问题可能不是在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()方法在被调用时立即提交到数据库而不必手动保存它?我应该如何或在哪里开始或了解这一点?

最佳答案

从我所看到的,您正在寻找一个调用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一起使用。

09-27 00:51
查看更多