Hibernate"资源类型Session没有实现java.lang.AutoCloseable"

时间:2014-12-10 09:24:56

标签: java hibernate session extends implements

我想使用构造

import org.hibernate.Session;
...
try (Session session){

}

我该怎么做? 因为"资源类型Session没有实现java.lang.AutoCloseable"

我知道,我需要扩展Session并覆盖AutoCloseable方法,但是当我尝试这样做时,会出现错误" Session类型不能是SessionDAO的超类;超类必须是一个类"

更新

我已经编写了自己的DAO框架,但将使用Spring

1 个答案:

答案 0 :(得分:2)

首先,您应该使用更加可靠的会话/事务处理基础架构,就像Spring为您提供的那样。这样,您可以跨多个DAO调用使用相同会话,并且事务边界由@Transactional注释显式设置。

如果这是针对您的测试项目,您可以像这样使用a simple utility

protected <T> T doInTransaction(TransactionCallable<T> callable) {
    T result = null;
    Session session = null;
    Transaction txn = null;
    try {
        session = sf.openSession();
        txn = session.beginTransaction();

        result = callable.execute(session);
        txn.commit();
    } catch (RuntimeException e) {
        if ( txn != null && txn.isActive() ) txn.rollback();
        throw e;
    } finally {
        if (session != null) {
            session.close();
        }
    }
    return result;
}

你可以这样称呼它:

final Long parentId = doInTransaction(new TransactionCallable<Long>() {
        @Override
        public Long execute(Session session) {
            Parent parent = new Parent();
            Child son = new Child("Bob");
            Child daughter = new Child("Alice");
            parent.addChild(son);
            parent.addChild(daughter);
            session.persist(parent);
            session.flush();
            return parent.getId();
        }
});

请查看此GitHub repository以获取更多此类示例。