Java 如何将实体保存到数据库中?

Java 如何将实体保存到数据库中?,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我有一个简单的SpringMVC项目,用于将用户添加到数据库中。 我使用hibernate 4.1.9、spring framework 3.2.0和PostgreSQL 9.2 请参阅下面的代码 用户bean package org.vdzundza.beans; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import j

我有一个简单的SpringMVC项目,用于将用户添加到数据库中。 我使用hibernate 4.1.9、spring framework 3.2.0和PostgreSQL 9.2

请参阅下面的代码

用户bean

package org.vdzundza.beans;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
    @SequenceGenerator(name = "user_seq", sequenceName = "user_seq")
    @Column(name = "id")
    private Long id;

    @Column(name = "network")
    private String network;

    @Column(name = "photo")
    private String photo;

    @Column(name = "identity")
    private String identity;

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

    @Column(name = "hash")
    private String hash;

    @Column(name = "isonline")
    private Boolean isOnline;

    public User() {
    }
    //getters and setters

    @Override
    public String toString(){
        StringBuilder out = new StringBuilder();
        out.append("[");
        out.append("name: " + firstName + " " + lastName);
        out.append("\tnetwork: " + network);
        out.append("\t Is online: " + isOnline);
        return out.toString();

    }        
}
UserDAO

package org.vdzundza.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.vdzundza.beans.User;

@Repository
public class UserDAOImpl implements UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void addUser(User user) {
        sessionFactory.openSession().save(user);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<User> listUser() {
        return sessionFactory.openSession().createCriteria(User.class).list();
    }
}

如何解决此问题?

打开会话并保存对象后。。。刷新会话,然后关闭它

Session session = sessionFactory.openSession();
session.save(user);
session.flush();
session.close();

打开会话并保存对象后。。。刷新会话,然后关闭它

Session session = sessionFactory.openSession();
session.save(user);
session.flush();
session.close();

利用
休眠事务

在一个
事务
中,您可以执行多个操作,并且在成功完成所有操作后可以提交
事务
。这里的优点是,如果在
操作批处理中有一个操作失败,您可以
回滚所有以前的操作

  Session session = factory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();


        session.save(user);


        tx.commit(); // Flush happens automatically
    }
    catch (RuntimeException e) {
        tx.rollback();
        throw e; // or display error message
    }
    finally {
        session.close();
    }

利用
休眠事务

在一个
事务
中,您可以执行多个操作,并且在成功完成所有操作后可以提交
事务
。这里的优点是,如果在
操作批处理中有一个操作失败,您可以
回滚所有以前的操作

  Session session = factory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();


        session.save(user);


        tx.commit(); // Flush happens automatically
    }
    catch (RuntimeException e) {
        tx.rollback();
        throw e; // or display error message
    }
    finally {
        session.close();
    }

我看不到您的hibernate会话被刷新到数据库的任何地方。快速修复方法可能是在DAO中打开的会话上调用flush。一个更完整的解决方案是使用Spring TransactionManager-例如将您的服务方法注释为@Transactional实际上我看到您已经使用了@Transactional,但我看不出在您的应用程序上下文中在何处启用了注释事务。ie希望看到这样的东西
(请参阅)。当事务提交时,刷新将为您完成。我看不到您的hibernate会话刷新到数据库的任何地方。快速修复方法可能是在DAO中打开的会话上调用flush。一个更完整的解决方案是使用Spring TransactionManager-例如将您的服务方法注释为@Transactional实际上我看到您已经使用了@Transactional,但我看不出在您的应用程序上下文中在何处启用了注释事务。ie希望看到这样的东西
(请参阅)。当事务提交时,刷新将为您完成。
Hibernate: select nextval ('user_seq')
Hibernate: select this_.id as id0_0_, this_.firstname as firstname0_0_, this_.hash as hash0_0_, this_.identity as identity0_0_, this_.isonline as isonline0_0_, this_.lastname as lastname0_0_, this_.network as network0_0_, this_.photo as photo0_0_ from users this_
Session session = sessionFactory.openSession();
session.save(user);
session.flush();
session.close();
  Session session = factory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();


        session.save(user);


        tx.commit(); // Flush happens automatically
    }
    catch (RuntimeException e) {
        tx.rollback();
        throw e; // or display error message
    }
    finally {
        session.close();
    }