我希望能够使用一个实体管理器为涉及不同实体对象的CRUD操作提交多个事务。例如,我希望能够在一个实体管理器会话期间删除cat实体对象并创建新的dog实体对象。我通过让catService和dogService(可以CRUD对象的对象)扩展GenericService来实现这一点:
public abstract class GenericService<T> {
private Class<T> type;
protected static EntityManager entityManager;
public GenericService() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
if (entityManager == null || !entityManager.isOpen()) entityManager = GetEntityManager.getInstance(); // zo kunnen meerdere services gebruik maken van dezelfde entitymanager sessie. 1 operation per sessie is een antipattern namelijk. Beter meerdere operations in 1 sessie doen.
}
// sluit entityManager en daarmee dus ook de sessie af.
public void close(){
entityManager.close();
}
现在两个服务共享同一个实体管理器。现在我可以进行多个事务并仅在最后一个Service对象上调用继承的close()方法,然后关闭共享实体管理器。
我打算制作一个Web应用程序,所以我想知道是否通过让不同的实体对象共享的不同服务对象共享它们来更有效地使用实体管理器会话与打开和关闭新会话相比,它会获得性能提升(实体)经理)只做一次交易。
谢谢。
答案 0 :(得分:1)
每次操作会话是anti-pattern但不是出于性能原因。你可以做很多额外的计算(比如创建会话)而不会注意到任何性能差异,因为等待数据库完成一个事务需要很长时间,而不是做额外的计算(数据库I / O操作需要几毫秒才能完成,计算需要纳秒完成)。
由于您打算创建一个Web应用程序,请尝试使用Hibernate的sessionFactory.getCurrentSession()
,这样可以在GenericService
的构造函数中执行您现在所做的操作 - user guide中的更多信息, this answer和javadocs。