我想使用构造
import org.hibernate.Session;
...
try (Session session){
}
我该怎么做? 因为"资源类型Session没有实现java.lang.AutoCloseable"
我知道,我需要扩展Session并覆盖AutoCloseable方法,但是当我尝试这样做时,会出现错误" Session类型不能是SessionDAO的超类;超类必须是一个类"
更新
我已经编写了自己的DAO框架,但将使用Spring
答案 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以获取更多此类示例。