`SessionFactory`和`Session`对象不能与“try-with-resource”一起使用?

时间:2017-12-12 04:34:50

标签: java hibernate

使用hibernate时,我想看看SessionFactorySession对象是否可以使用“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

这是否意味着SessionFactorySession对象无法使用“try-with-resource”,因为这两个类没有实现AutoCloseable接口?

感谢。

2 个答案:

答案 0 :(得分:2)

  

这是否意味着SessionFactorySession个对象无法使用   “try-with-resource”,因为这两个类没有实现   AutoCloseable界面?

是的,这正是它的含义。

但是,如果您查看较新版本的Hibernate,您会发现SessionFactorySession都会在那里实现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())) {

}