【问题标题】:Hibernate not saving object to database休眠不将对象保存到数据库
【发布时间】:2013-04-25 19:00:12
【问题描述】:

我一直在尝试建立一个小的 hibernate/spring MVC 项目。

我已经获得了 Spring .jsp 页面来显示数据库中的数据,但我不知道如何让休眠将对象保存到数据库中。

这是我的(相关)代码:

GroupDAOImpl.java(方法)

@Override
public void saveGroup(Group group){
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    session.save(group);

    transaction.commit();
    session.close();
}

HelloController.java 方法:

 public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Group group) throws Exception {
    groupDAO.saveGroup(group);
    return new ModelAndView("redirect:list.htm");
}

jsp页面:

<form:form action="add.htm" commandName="group">
<table>
    <tr>
        <td>group Name :</td>
        <td><form:input path="name"/></td>
    </tr>

    <tr>
        <td colspan="2"><input type="submit" value="Register"></td>
    </tr>
</table>

来自服务器的日志:

Hibernate: insert into groups (id, name, shoppingList_id) values (default, ?, ?)

GroupDAOImpl 保存方法中“组”的调试器值:

id = 2
name = "jjjj"

有什么想法吗?非常感谢!

【问题讨论】:

  • 据我了解,问题是数据没有保存在数据库中?您的数据源是如何定义的 - 在 Spring 中或者它独立于 Spring。你用的是什么数据库?
  • Group 类是什么样的?对象是已经存在还是新实例?它是如何保存在 DAO 中的?
  • 我用的是derby数据库,数据库是spring配置的&lt;bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; &lt;property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/&gt; &lt;property name="url" value="jdbc:derby://localhost:1527/hiber-db"/&gt; &lt;property name="username" value="oe"/&gt; &lt;property name="password" value="oe"/&gt; &lt;/bean&gt;

标签: spring hibernate model-view-controller


【解决方案1】:

其实我们在日志上看到了SQL请求:

Hibernate: insert into groups (id, name, shoppingList_id) values (default, ?, ?)

我猜你解释得不好,你希望它是你现有对象的 SQL 更新查询。

如果要更新对象,SpringMVC绑定提供的Group实例应该知道对象id。 实际上,表单不会发送 Group id,因此您的应用程序无法知道应该更新哪个对象。

即使知道 ID,也需要调用 Session.merge 而不是 Session.save :)

【讨论】:

  • 好吧,数据库中已经有 1 个项目,但我想添加另一个项目,而不是更新现有项目。 id 尚未设置,因为它应该由 hibernate 通过@GeneratedValue(strategy = GenerationType.AUTO) 设置
【解决方案2】:

据我所知hibernate属性需要以hibernate为前缀,比如

<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />

解决这个问题,这可能是你的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多