Java EE 7的核心接口(EntityManager等)是否可以扩展AutoClosable接口?

7
我一直在想,Java EE 7 的核心接口是否会扩展 AutoCloseable。 (通过 core interfaces,我主要指的是 EntityManager 和类似的接口,但我不确定是否还有其他可能自动关闭的接口或类。)
我认为他们应该这样做,这是我的假设基础。

Java 6的Connection甚至没有继承Closeable, 然而Java 7的Connection继承了AutoCloseable(就像java.sql包中的其他接口一样)。

EntityManager这样的接口能否以使得它能够为我们服务的方式继承AutoCloseable,考虑到Java 7的try-with-resources语句?或者自动关闭EntityManager过于复杂?

这个特定的功能是否被视为 JSR-342 的一部分?


1
我认为在JPA规范邮件列表(http://java.net/projects/jpa-spec/lists)上提出这个问题是一个好的选择。 - Piotr Nowicki
它曾经在Servlet列表上出现过。问题在于JPA、JSF等希望在Java EE之外保持向后兼容性。 - Mike Braun
2
如果您使用容器管理版本的JPA,事务确实会像您所说的“自动神奇”一样启动和关闭,您不必担心这个问题。如果您的问题与应用程序管理版本的JPA有关,则应编辑该问题。 - jmoreira
1个回答

7
如果您正在管理自己的JPA对象,那么使用try-with-resources语句来管理EntityManagers(以及在较小程度上管理EntityManagerFactory)是很好的选择。
我选择创建一个实用程序,将EntityManagerFactory包装在 java.lang.reflect.Proxy中,并实现接口的AutoCloseable版本。然后,调用处理程序拦截对createEntityManager()方法的调用,以便返回代理版本的基础EntityManager实例,这些实例也实现了AutoCloseable。
我认为,在容器管理的JPA对象世界中工作要容易得多,但如果您被困在简单的Web应用程序中,则此方法可能适合您。

3
Massfords忘了提到他写了一篇很棒的文章,介绍了如何实际创建这样的代理,你可以在这里找到它:http://massfords.com/Proxy-for-AutoCloseable/。谢谢Mark! - wpodgorski
2
@wpodgorski 非常感谢!:-) 但是自那时以来,链接已更改为:https://massfords.com/2016/06/06/proxyforautocloseable/ - hu-zza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接