【发布时间】:2014-10-05 05:22:27
【问题描述】:
我很难不在我目前正在开发的 Java 程序中重复自己。
比方说,我需要声明很多方法,这些方法基本上是按以下方式构造的:
public SomeEntity doSomething (String someAttribute, String anotherAttribute) {
EntityManager em = this.createEntityManager();
EntityTransaction tx = null;
try {
/*
* ... independent logic ...
*/
tx = em.getTransaction();
} catch (RuntimeException e) {
if (tx != null && tx.isActive()) {
tx.rollback();
}
throw e;
} finally {
em.close();
}
return something;
}
所有方法的方法体都需要包含资源管理的这些元素。
“独立逻辑”本身也会相当复杂,因此将 try/catch 语句放在单独的方法中实际上是行不通的。
我想避免重复这段代码。在这些情况下应用的最佳做法是什么?
【问题讨论】:
-
也许 try-with-resources 可以帮助你 -- docs.oracle.com/javase/tutorial/essential/exceptions/…
-
这是“执行周围”模式可以提供帮助的地方:stackoverflow.com/questions/341971/…
-
嘿@AndersR.Bystrup,非常感谢。我不得不承认我不知道,try-with-resources 存在。不幸的是
javax.persistence.EntityManager没有实现AutoClosable。 -
然后将其包装到实现
AutoClosable的对象中:)。 IE。您的createEntitiyManager方法返回ClosableEntitiyManager,它是实现AutoClosable的EntityManager的包装,您就完成了。 -
解决这个问题的另一种方法是使用 Spring。您声明了一个带有
@Transactional注释的方法,所有事务工作都为您完成。
标签: java