覆盖EclipseLink EntityManager

时间:2014-04-13 20:04:02

标签: java jpa eclipselink override

有没有办法覆盖EntityManager提供的EclipseLink? 我想覆盖EclipseLink's EntityManager.remove()方法 - 我不想要物理删除(仅限逻辑)。 扩展适当的EntityManager

很容易
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文件中传递?

3 个答案:

答案 0 :(得分:1)

我认为覆盖实体管理器的默认行为是不恰当的。如果你需要实际删除一个实体,那么它就不可能了。

最好有一个包装这些方法的辅助包装类,而不是直接访问实体管理器&然后根据需要委托请求。

下面是伪代码。

/** 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);
   } 
}

答案 1 :(得分:1)

EcliseLink支持软交换,无需覆盖EntityManager。有关详细信息,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/SoftDelete。这允许您更改EclipseLink使用的删除查询,以便更改字段值而不是删除。您可以添加@AdditionalCriteria以防止通过查询读取已删除的记录,以便它们也会被删除。

否则,除非您确定不会使用级联或私有所有权,否则您无法覆盖EclipseLink EntityManagerImpl上的remove方法。 remove方法将工作委托给内部方法已经对每个映射有了更多的了解,因此如果使用任何级联选项,您还需要覆盖或拦截内部调用。如果您不打算使用级联选项,我将创建您自己的持久性提供程序类集和使用这些类的新持久性单元。然后,您的提供者类将查找第一个持久性单元并委托给它 - 类似于大多数容器使用代理类注入工厂和EntityManagers的方式。

答案 2 :(得分:1)

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>