【发布时间】:2011-10-15 08:27:03
【问题描述】:
我有几个问题都与在应用程序中创建和使用实体管理器的方式有关,Virtual Private Databases 是 Oracle DB 中启用行级安全性的一个特性。
在会话 bean 中,我们通常将实体管理器作为成员,并且它通常由容器注入。这个实体管理器是如何由容器管理的——我的意思是,如果我们想实现一个
Virtual Private Database,那么我们必须确保Virtual Private Database-context 在整个用户会话中保持有效,并且我们不必设置这个上下文每次在我们触发查询之前。 (在这里包括更多的废话:一个会话 bean 实现了几个函数,每个函数都使用相同的实体管理器;现在,我们不应该每次都在这些函数中设置虚拟私有数据库数据库操作)。进一步#1,由于实体管理器缓存在会话bean中,我们是否需要在任何情况下显式关闭实体管理器? (就像我们对 JDBC 连接所做的那样?)
另外,我想知道使用 JTA 或非 JTA 数据源的用例(或设计标准)应该是什么。我们创建实体管理器的方式是否依赖于此?
要添加对 VPD 的要求: 如果容器管理的 EM 能够以某种方式强制执行每个用户的 VPD,那就太好了。请注意,此处注入了 EM,因此应该有一种机制可以在连接上设置 VPD(稍后在“this”会话中为“this”用户检索相同的连接)。
如果没有注入的 EM,我认为可以使用对 EMF 的引用然后设置 EM 的属性。就像是 : ((org.eclipse.persistence.internal.jpa.EntityManagerImpl)em.getDelegate()).setProperties
如果每次触发查询之前都设置了 VPD,那么连接应该在用户会话期间“维护”VPD 上下文,然后将连接(在清除 VPD 之后)释放回池.
【问题讨论】:
标签: oracle jakarta-ee jpa ejb entitymanager