hibernate - JPA (Hibernate) 和在运行时设置实体监听器

标签 hibernate jpa runtime entitylisteners

我有两个项目:

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

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

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

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

也许有一些 Hibernate 属性用于此目的,但我忽略了...... 谢谢。

最佳答案

这为所有实体设置了一个通用的 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
   }
}

关于hibernate - JPA (Hibernate) 和在运行时设置实体监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11673022/

相关文章:

performance - Hibernate/JPA 与 JDBC 性能对比

java - 使用 EclipseLink JPA 插入 Null 结构

c# - 在运行时生成通用类型

java - hibernate HQL 中的 "where exists"

java - 无法禁用 Hibernate 日志消息

java - Hibernate OneTOMany 映射错误

java - 未使用迁移查询的默认值创建 JPA 实体

runtime - 如何使用 C++ Builder 在运行时以编程方式构造组件?

c++ - 运行时多态性到底是什么意思?

java - 无法定位静态元模型字段