我有两个项目:
- beans.jar 与 JPA 实体(针对 JSON/XML 序列化进行注释)和
persistence.xml
文件 - rest.war 与 REST 应用程序,其中使用自定义属性(例如
hibernate.connection.*
)实例化 JPAEntityManagerFactory
我想分发 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/