使用hibernate时,我想看看SessionFactory
和Session
对象是否可以使用“try-with-resource”,这样我就无法忽略调用它们的close()
方法:
try (SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession()){
session.beginTransaction();
Customer customer = new Customer();
customer.setFirstName("James");
customer.setLastName("Bond");
customer.setSsn(999998);
customer.setAddressLine1("1111 S St");
customer.setCity("London");
customer.setState("LDN");
customer.setCountry("UK");
session.save(customer);
session.getTransaction().commit();
// session.close();
// sessionFactory.close();
} catch (Exception e) {
e.printStackTrace();
}
但是我得到了错误:
CustomerTest.java:12: error: incompatible types: try-with-resources not applicable to variable type
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
^
(SessionFactory cannot be converted to AutoCloseable)
CustomerTest.java:18: error: incompatible types: try-with-resources not applicable to variable type
Session session = sessionFactory.openSession()){
^
(Session cannot be converted to AutoCloseable)
2 errors
这是否意味着SessionFactory
和Session
对象无法使用“try-with-resource”,因为这两个类没有实现AutoCloseable
接口?
感谢。
答案 0 :(得分:2)
这是否意味着
SessionFactory
和Session
个对象无法使用 “try-with-resource”,因为这两个类没有实现AutoCloseable
界面?
是的,这正是它的含义。
但是,如果您查看较新版本的Hibernate,您会发现SessionFactory
和Session
都会在那里实现AutoCloseable
接口。
我认为这个更改是在Hibernate 5中进行的,所以升级你的Hibernate版本可能是一个潜在的解决方案。
答案 1 :(得分:0)
已在hibernate版本5中修复此问题。如果您可以升级到版本5,请使用此版本。支持的Jira票证
https://hibernate.atlassian.net/browse/HHH-8898
对于无法升级的项目,我们可以实现自己的 CloseableSession 界面。
public class CloseableSession implements AutoCloseable {
private final Session session;
public CloseableSession(Session session) {
this.session = session;
}
public Session getSession() {
return session;
}
@Override
public void close() {
session.close();
}
}
<强>用法强>
try (CloseableSession session = new CloseableSession(
sessionFactory.openSession())) {
}