2017-12-12 7 views
1

休止状態使用している場合、私はSessionFactorySessionオブジェクトは、「してみてください-とリソース」、私は彼らのclose()メソッドを呼び出すことは無視できないようにして働くことができるかどうかを確認したいと思います:`SessionFactory`と` Session`オブジェクトは "try-with-resource"で動作できません。

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(); 
} 

私はエラーを取得しますしかし:2つのクラスがAutoCloseableインタフェースを実装していないので、

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オブジェクトは、「してみてください-とリソース」で働くことができないことを意味するのでしょうか?

ありがとうございました。

答えて

1

2つのクラスが AutoCloseableインタフェースを実装していないので、それは、「トライとリソース」SessionFactorySessionオブジェクトが では動作しないことを意味するのでしょうか?

はい、まさにその意味です。

ただし、新しいバージョンのHibernateを見てみると、SessionFactorySessionの両方にAutoCloseableインターフェイスが実装されています。

変更がHibernate 5で行われたと思いますので、Hibernateのバージョンをアップグレードすることは潜在的な解決策になる可能性があります。

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())) { 

} 
関連する問題