5

我有以下问题,当试图在数据库中插入对象时,休眠卡住,没有返回错误,对象没有正确保存。

调试它我发现它挂在

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 插入命令,它可以工作。

4

2 回答 2

11

我没有看到你在刷新你的会话

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();
    }
于 2013-08-02T15:24:07.573 回答
0

Kotlin 让事情变得更简单:

import org.hibernate.Session

val session: Session get() = sessionFactory.openSession()

fun Session.executeTransaction(action: (Session) -> Unit) = use {
    val transaction = it.beginTransaction()
    action(it)
    transaction.commit()
}

fun <T> T.saveToDb() = session.executeTransaction { it.save(this) }

fun <T> T.updateAtDb() = session.executeTransaction { it.update(this) }

fun <T> T.deleteFromDb() = session.executeTransaction { it.delete(this) }

使用示例:

class UserService {

    fun save(user: UserEntity) {
        user.saveToDb()
    }
}

或者

val user = UserEntity(id = 1, name = "John Snow")
user.saveToDb()

也许有人还需要:

import org.hibernate.SessionFactory
import org.hibernate.boot.registry.StandardServiceRegistryBuilder
import org.hibernate.cfg.Configuration

object HibernateSessionFactoryUtil {

    val sessionFactory: SessionFactory by lazy {
        val configuration = Configuration().configure()
        configuration.addAnnotatedClass(UserEntity::class.java)
        val builder = StandardServiceRegistryBuilder().applySettings(configuration.properties)
        configuration.buildSessionFactory(builder.build())
    }
}

我们正在使用 Kotlin .use{},它会在 finally 块中自动关闭会话

于 2022-01-25T23:14:18.320 回答