Hibernate无法将对象保存到数据库中?

6

我有一个问题,当尝试将对象插入数据库时,Hibernate会卡住,没有返回错误,对象没有被正确保存。

调试后发现它卡在

Hibernate: select nextval('hibernate_sequence')

我将使用PostgreSQL作为数据库。
我的配置文件如下:
<hibernate-mapping>
    <class name="src.MyClass" table="MyClass">

    <cache usage="read-write"/>

    <id name="id" column="classid">
        <generator class="native" />
    </id>

    <property name="name" column="name" not-null="true" unique="true" length="160"/>

</class>
</hibernate-mapping>

@Override
public void save( Myclass mc)
{
    Session session = sessionFactory.getCurrentSession();

    session.save( mc);
}

选择(SELECT)部分是有效的。

我不确定我缺少什么。 同时,如果使用本地SQL插入命令,则可以正常工作。


2
哎呀,使用注释吧。当 JPA 2 存在时,请不要浪费时间用 XML :) - David Hofmann
1
序列 'hibernate_sequence' 是否存在? - Luca Basso Ricci
1
你需要确保在Session对象中开始(begin())和提交(commit())事务(或者是在save()之后使用flush()?)才能使你的save()方法正常工作。 - David Hofmann
1
是的,'hibernate_sequence' 存在。我使用 XML 是因为该项目较旧,我需要遵守其配置。 - Mythul
如果可能的话,您可以推动管理层升级到最新版本,这将减轻痛苦。 - Suresh Atta
我也曾经有过同样的症状,但是是因为错误配置了Spring JpaRepository的事务管理器。所以,切换从DataSourceTransactionManager到JpaTransactionManager解决了这个问题。参考链接:https://dev59.com/F5_ha4cB1Zd3GeqP27BE#42591919 - imy
1个回答

12

我没看到你把会话清除了

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

但最可取的是

Session session = factory.openSession();
    Transaction tx = null;
    try {
        tx = session.beginTransaction();
        session.save(mc);
        tx.commit(); // Flush happens automatically
    }
    catch (RuntimeException e) {
        tx.rollback();
        throw e; // or display error message
    }
    finally {
        session.close();
    }

它使用flush工作了。哈哈,我在这个问题上浪费了很多时间。至少我学会了如何使用Hibernate进行调试...谢谢 - Mythul
非常感谢!调用session.flush()很有帮助!有趣的是,当使用MySQL时,一切都可以正常工作,而不需要显式刷新。我需要这个来解决我在这里描述的问题:https://dev59.com/Q5zha4cB1Zd3GeqPIaru - informatik01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接