运行时的JPA(Hibernate)和Setup Entity Listener

时间:2012-07-26 15:42:44

标签: hibernate jpa runtime entitylisteners

我有两个项目:

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

我想分发beans.jar以方便客户端编程。到目前为止还不错。

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

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

也许有一些Hibernate属性,我忽略了...... 感谢。

1 个答案:

答案 0 :(得分:0)

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

创建一个名为orm.xml的文件,并将其放在与persistence.xml文件相同的目录中(例如META-INF)。我不确定这是否可以放在war文件中。 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
   }
}