Java 如何将实体保存到数据库中?
我有一个简单的SpringMVC项目,用于将用户添加到数据库中。 我使用hibernate 4.1.9、spring framework 3.2.0和PostgreSQL 9.2 请参阅下面的代码 用户beanJava 如何将实体保存到数据库中?,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
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();
}