3

我有两个项目:

  • 带有 JPA 实体(为 JSON/XML 序列化注释)和persistence.xml文件的beans.jar
  • rest.war与 REST 应用程序,其中 JPAEntityManagerFactory使用自定义属性实例化,例如hibernate.connection.*

我想分发 beans.jar 以获得更好的客户端编程便利。到目前为止很好。

有些实体在@PrePersist事件中有代码(实际上是盐化密码哈希),我不想分发。我可以将该代码推送到 JPA 实体侦听器,但是在@EntityListeners注释中引用了侦听器类,因此也必须在 beans.jar 中。

是否可以在运行时(即在 rest.war 项目中)为一个(或所有)实体类设置 JPA 实体侦听器?

也许有一些休眠属性,我忽略了......谢谢。

4

1 回答 1

0

这为所有实体设置了一个通用的 EntityListener。

创建一个名为 orm.xml 的文件并将其放在与 persistence.xml 文件相同的目录中(例如 META-INF)。我不确定这是否可以放入战争文件中。orm.xml 文件的内容应该如下:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd">
   <persistence-unit-metadata>
      <persistence-unit-defaults>
         <entity-listeners>
            <entity-listener class="nathan.db.Listener"/>
         </entity-listeners>
      </persistence-unit-defaults>
   </persistence-unit-metadata>
</entity-mappings>

然后创建一个名为 Listener 的类。

package nathan.db;

import javax.persistence.PrePersist;

public class Listener
{
   @PrePersist
   public void event(Object entity)
   {
      // salt password
   }
}
于 2013-06-08T01:04:58.760 回答