Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 凌驾日食实体管理器_Java_Jpa_Eclipselink_Overriding - Fatal编程技术网

Java 凌驾日食实体管理器

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)

是否有方法覆盖EclipseLink提供的
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
应该允许这样做呢?不幸的是,这是最好的解决方案。不幸的是,因为实现持久性提供程序等于编写数百行代码。