Java 凌驾日食实体管理器
是否有方法覆盖EclipseLink提供的Java 凌驾日食实体管理器,java,jpa,eclipselink,overriding,Java,Jpa,Eclipselink,Overriding,是否有方法覆盖EclipseLink提供的EntityManager? 我想覆盖EclipseLink的EntityManager.remove()方法-我不希望物理删除(仅逻辑删除)。 扩展适当的实体管理器很容易: public class MyEntityManager extends org.eclipse.persistence.internal.jpa.EntityManagerImpl { public MyEntityManager(String sessionName)
EntityManager
?
我想覆盖EclipseLink的EntityManager.remove()
方法-我不希望物理删除(仅逻辑删除)。
扩展适当的实体管理器很容易:
public class MyEntityManager extends org.eclipse.persistence.internal.jpa.EntityManagerImpl {
public MyEntityManager(String sessionName) {
super(sessionName);
}
public void remove(Object entity) {
AbstractEntity en = (AbstractEntity)entity;
en.setAuditRD(33333);
this.merge(en);
}
}
但是,如何将其传递到EclipseLink的工厂,以创建MyEntityManager
,而不是org.eclipse.persistence.internal.jpa.EntityManagerImpl
?可能有任何参数,我可以在persistence.xml
文件中传递吗?我认为覆盖实体管理器的默认行为是不合适的。在这种情况下,您需要实际删除一个实体,这将是不可能的
最好有一些封装这些方法的助手包装类,而不是直接访问实体管理器&然后根据需要委派请求
下面是伪代码
/** Use this wrapper class instead of EntityManager*/
class DBManager {
/** Implementing required methods*/
remove(E e){
em.remove(e); //-- Removing entity from DB
}
/** Give any appropriate method name to use application wide
and implement custom logic, discarding entity logically */
markInActive(E e){
AbstractEntity en = (AbstractEntity)e;
en.setAuditRD(33333);
em.merge(en);
}
}
EcliseLink支持软增量,无需覆盖EntityManager。有关详细信息,请参阅。这允许您更改EclipseLink使用的删除查询,以便更改字段值而不是删除。您可以添加@AdditionalCriteria以防止通过查询读入已删除的记录,从而使它们看起来也已删除
否则,您不能仅仅覆盖EclipseLink EntityManagerImpl上的remove方法,除非您确定永远不会使用级联或私有。remove方法将工作委托给内部方法,因为内部方法对每个映射都有更多的了解,因此如果使用任何级联选项,您也需要重写或拦截内部调用。如果您不打算使用级联选项,我将创建您自己的一组持久性提供程序类和一个使用这些类的新持久性单元。然后,您的提供程序类将查找第一个持久化单元并将其委托给它——类似于大多数容器使用代理类注入工厂和实体管理器的方式 在persistence.xml
类中,您有一个provider
元素来决定它。只需将提供者的实现放在那里(而不是EntityManager
)。摘自JPA规范:
8.2.1.4供应商
provider元素指定持久性提供程序的javax.persistence.spi.PersistenceProvider的名称
班级。provider元素是可选的,但是如果
应用程序依赖于特定的持久性提供程序
正在使用中
文件示例:
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="myapp">
<provider>org.mydomain.ejb.MyPersistenceProvider</provider>
<jta-data-source>java:/DefaultDS</jta-data-source>
</persistence-unit>
</persistence>
org.mydomain.ejb.MyPersistenceProvider
java:/DefaultDS
你是对的(顺便说一句,我使用了EJB
),但问题与管理JPA
关系有关。假设我有一个EntityA
,它将@OneToMany
映射到EntityB
——这意味着EntityA
包含EntityB
的列表。现在,当我从列表中删除一些EntityB
并调用EntityManager.persist(entityA)
时,我希望从逻辑上删除EntityB
。不幸的是,JPA
调用EntityManager并从物理上删除它。Ofc。我可以遍历列表并分别更新每个元素,但是为什么JPA
应该允许这样做呢?不幸的是,这是最好的解决方案。不幸的是,因为实现持久性提供程序等于编写数百行代码。