我读过很多关于Java持久性的书籍和文章,而且我越读越容易混淆我关于如何正确使用JPA和高效。如何高效地使用EntityManager?
现在我有简单服务层为每种类型的实体的这需要持续的照顾,删除,搜索,等它从单 UTIL类获取的EntityManagerFactory,创建的的EntityManager,做交易,然后关闭的的EntityManager。 EMF仅在应用程序关闭时关闭。如果我理解正确,通过关闭EntityManager,我所有的对象(与它有关)都变得分离。通过改变对象中的任何值,它们不会被持久化,所以我认为是这样。
在一本书我读过,我应该做的服务类@Stateless豆,并注入的的EntityManager在他们@PersistenceContext。这样,我将拥有与我拥有的许多服务类相同数量的EntityManagers (或者它足够聪明,只能注入一个?)。我认为当一个对象被更多的EntityManagers处理时,会出现这种情况,效率低下,可能会导致错误。我可以让EntityManager成为一个单例,它保存并管理所有内容,并且像EMF一样在整个应用程序生命周期内生存吗?
正如我了解到,EntityManager的应在每次交易后关闭,但后来我感到困惑的管理部分:
在我的情况:
Car car = CarService.findOneById(somelong); //this method returns an already detached object, nothing is ever in managed state
car.setColor("yellow");
CarService.update(car); //updates the db
(这甚至不是。问题的,我呢,只是一个不必要的坏,直到延迟抓取进场)
如何,我认为它应该工作:
Car car = CarService.findOneById(somelong); //does not close the EM
car.setColor("yellow"); //by this call the EM detects(?) and persists the change
什么是实现这个目标的方法,哪个被认为是最佳实践?如果你能给我一个每层的例子,我会很感激。
预先感谢您!
P.S .:我知道这个问题非常广泛,但我希望有人可以从我的头上抹掉问题标记。
这是相当宽泛的,我不确定你会得到明确的答案。我个人使用Spring的'@ Transactional'方面为我声明性地处理事务边界,并且不要手动打开或关闭实体管理器。 – chrylis
你使用Spring还是Java EE? –
@ArtemNovikov我正在使用Java EE。 – Peter