如何使用spring + hibernate将数据插入数据库?
Posted
技术标签:
【中文标题】如何使用spring + hibernate将数据插入数据库?【英文标题】:How to insert data into the database using spring + hibernate? 【发布时间】:2014-11-20 00:31:29 【问题描述】:有关用户信息,请参阅我有 user.java。
@Entity(name = "user")
@Table(name = "user")
public class User
@Id
@Column(name = "id")
private String id;
@Column(name = "password")
private String password;
//getter and setter for this..
这是我的用户道
public class UserDao
public interface UserDAO
public String insert(User user);
这是插入数据库的 impl 类 看到这是我的代码。请检查并告诉我我做错了什么
@Repository
@Transactional
public class UserImpl implements UserDAO
private DataSource dataSource;
@Autowired
SessionFactory sessionFactory;
@Resource(name = "sessionFactory")
public void setDataSource(DataSource dataSource)
this.dataSource = dataSource;
@Override
public String insert(User use)
Session session = this.sessionFactory.openSession();
try
Session sess = this.sessionFactory.getCurrentSession();
session.save(reg);
return (String)user.getUserName();
catch(Exception e)
System.out.println("in catch"+e.getMessage());
e.printStackTrace();
成功注册后,在我的控制器中,我通过这个将数据插入到数据库中
userDao.insert(user);
但我没有得到输出意味着没有任何数据插入到数据库中。为什么会这样..?这是我的 mvc 配置
<context:component-scan base-package="com.user.xyz" />
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/images/, /resources/css/" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
【问题讨论】:
我怀疑您可能只需要将@Transactional
注释添加到您的 insert
方法中。但是,您有一个 JPA 实体,那么您是否有理由不使用实体管理器?您不需要触摸 Hibernate 会话。另请注意,如果您将 Spring Data 添加到您的项目中,那么您可以删除您的实现并“免费”获得更多功能。 :)
看看这是我的代码。请检查它并告诉我我做错了什么
没有错……只是有更简单的方法(更少的代码)可用。本教程提供了一个使用 Spring Data 的简短示例:spring.io/guides/gs/accessing-data-jpa ... 基本上,您将 Spring Data 添加到您的依赖项并修改您的接口以扩展 CrudRepository 或 JpaRepository。那么你就不需要编写自己的 DAO 实现了。
不是一个答案,但对于处理任何规模的任何事情,休眠比它的价值更麻烦。我不是第一个决定在应用程序完成后从应用程序中删除任何休眠功能的人,因为它根本无法大规模执行。
【参考方案1】:
记住这一点:您没有任何现有会话,但您使用getCurrentSession()
。要使用此方法,您必须已经有一个会话。试试这个:
Session session = this.sessionFactory.openSession();
现在您有一个交易会话。
您应该在 xml 文件(hibernate.xml 或 spring.xml)中声明 sessionFactory,然后使用 @Autowire 获取它并打开新会话。
【讨论】:
...看到我添加了会话,但我仍然没有将任何数据添加到数据库中。你可以检查我的 mvc 配置文件。是否需要提供 bean 来实现 dao ..? 【参考方案2】:你有两个选择:
A.强制休眠刷新您在会话中所做的任何更改:
session.save(user);
session.flush();
B.让整个方法在事务中运行——这当然要好得多。提交事务时 - hibernate 将刷新对数据库的任何更改,就像您手动执行一样。
例如:
Transaction tx = null;
try
session.beginTransaction();
session.save(user);
....
tx.commit();
catch (RuntimeException e)
tx.rollback();
throw e;
【讨论】:
【参考方案3】:如果您在单个请求中有多个 DAO 调用,那么 session.getCurrentSession() 很有用,但我想这不是您的情况。 如果每个请求只有一个 DAO 调用,那么 session.openSession() 是正确的方法。
请注意,使用 session.openSession() 时,您还必须在之后关闭会话。
最好的办法是为每个传入请求打开一个会话(使用过滤器是最简单的方法),然后在所有 DAO 中调用 sessionFactory.getCurrentSession() 以获取当前会话。我猜你的问题是你没有指定过滤器。这样,您的所有 DAO 都将很容易重用,并且您无需在之后关闭会话。
您可以在文档中找到更多信息: Hibernate documentation
【讨论】:
【参考方案4】:我也遇到了同样的问题,并得到了解决方案。现在检查以下几点-
-
检查您正在使用的适当 jar 文件
检查 META-INF 文件夹中的 manifest.mf 以获取应用程序信息。
在配置文件中检查您的休眠配置以进行休眠模板配置。
最后如果一切正常,那么在插入之前使用session.flush()
。
会话会话 = sessionFactory.openSession();
交易 tx = session.beginTransaction();
//... 你的逻辑
//刷新一批插入并释放内存:
session.flush();
session.clear();
tx.commit();
session.close()
【讨论】:
不! hibernate conf肯定有问题。你能分享你的conf吗?详情? 你能告诉我是否需要在任何配置文件中添加 jdbcimpl 类的引用..?以上是关于如何使用spring + hibernate将数据插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config
如何在 Spring 生态系统中使用 JPA hibernate 连接到不同的 mysql 数据库模式?