我可以将属性注入JPA实体侦听器吗

TiG*_*iGz 5 java jboss ejb jpa

我可以对此建模,然后看看会发生什么,但是我很懒。我希望能够将EJB3注入我的JPA实体侦听器,以便它可以在PrePersist操作期间访问EJB的功能。那可能吗?如果不是...,那么在JBoss下,侦听器将创建一次,还是每次方法调用一次创建?我想我试图了解在执行JNDI查找等方面每次调用的轻量化程度

任何人都知道有关这些主题的大量信息,因为我简短的谷歌搜索并没有发现任何问题。

Mar*_*tin 2

您必须借助 JNDI 查找才能从 EntityListener 访问其他 EJB。我从未见过直接注入它们的方法——我认为这是因为 EntityListener 的语义。

以下内容来自我使用 JBoss 4.0.x 和 4.2.x 的经验。

作为一个例子,考虑@PostPersist——在执行插入语句后调用。有两个问题需要考虑:

  • 如果您打开另一个会话来查询当前实体(即使使用 JNDI 查找),数据库将不会反映当前实体。不能保证事务会仅仅因为会话被刷新而提交。您也不会拥有自动生成的主键。

  • 除了更新托管字段或在提交之前验证数据完整性(与数据库触发器不同)之外,实体侦听器似乎没有其他用途,这严重限制了它们的实用性。具体来说,在 JBoss 中,您甚至无法查找当前的安全上下文来记录谁正在进行更改。太糟糕了。

关于存在多少个实体侦听器,我在 JBoss 4.2.x 中的经验是只存在一个实例,并且在容器线程的上下文中调用这些方法。但是,在集群设置中可能并非如此。不管怎样,我建议你不要在任何实体监听器中缓存你的引用——目前还不清楚 JBoss 可能会对它们做什么(钝化它们?我希望不会,但你永远不知道!)。