Jpa @前置插入查询

Jpa @前置插入查询,jpa,jakarta-ee,eclipselink,hibernate-ogm,Jpa,Jakarta Ee,Eclipselink,Hibernate Ogm,我在下面的场景中:我在mysql中有一个通过JPA管理的实体。PolyPersist类的一些字段存储在mysql表中,该实体的单个字段(PolyPersistData)包含(相当大的)数据,使用@preperist处理程序存储在MongoDB中。 因此,PolyPersist存储在mysql表(eclipselink)中,但字段PolyPersistData存储在MongoDB(hibernate ogm)中 我知道“跨越”这些实体的生命周期并不是一种最佳实践(PolyPersist和PolyP

我在下面的场景中:我在mysql中有一个通过JPA管理的实体。
PolyPersist
类的一些字段存储在mysql表中,该实体的单个字段(
PolyPersistData
)包含(相当大的)数据,使用
@preperist
处理程序存储在MongoDB中。 因此,
PolyPersist
存储在mysql表(eclipselink)中,但字段
PolyPersistData
存储在MongoDB(hibernate ogm)中

我知道“跨越”这些实体的生命周期并不是一种最佳实践(
PolyPersist
PolyPersistData
)。 此外,在该处理程序中实例化EntityManager肯定是一个问题(据我所知,我应该限制EntityManager实例,因为它们在计算/内存占用方面很重)。
哪种方法最好?

正如您提到的,此实现存在一些问题。其中包括:

  • EntityManager实例化
  • 事务处理同步且缓慢
  • 在处理程序中持久化操作
我认为最好的方法是将MySQL和MongoDB持久性完全分离在不同的DAO/存储库中,并与上层或拦截器进行协调。根据所使用的平台(JavaSE/EE/Spring),实现将有所不同


我想你根本不需要MongoDB。删除MongoDB将使解决方案更简单。您可以使用自定义表空间或其他DB级别的技巧来处理MySQL内部的实体大小问题。

谢谢,本项目的全部目标是通过一个实验来证明(或反驳)使用这种多重持久性策略可以提高性能。因此,我对改进这种方法性能的任何方法都感兴趣。有什么建议吗?(我使用的是Tomcat上的JavaEE应用程序,没有Spring)。首先:在该方法中注入MongoDB EntityManager实例的最佳方法是什么?我将尝试查找容器管理的实体管理器,以避免EntityManager工厂。使用CDI事件或JMS异步将数据持久化到MongoDB可能是一个好主意,如果不是过度使用的话。请看这里:如果没有像Wildfly这样合适的应用服务器,这些解决方案是否可行?正如我所说,我使用的是Tomcat。您应该保留EntityManager,因为目标是只调用一次emfactory.createEntityManager()。EntityManager工厂实例很重,而不是EntityManager实例。EntityManager实例旨在对工作单元进行建模,应根据需要获取,完成后关闭并丢弃。如果您需要访问Mongo DB EMF,为什么不将其封装在一个可供所有调用访问的单例中呢?
@Entity
public class PolyPersist {

    public PolyPersist() {
    }
    public PolyPersistData getPolyPersistData() {
        return this.polyPersistData;
    }
    public void setPolyPersistData(PolyPersistData o) {
        this.polyPersistData = o;
    }

    @PrePersist
    @PreUpdate
    @PreMergeTransient
    public void serializeData() throws UnsupportedEncodingException, ClassNotFoundException, JAXBException {
        EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("MongoEM");
        EntityManager em = emfactory.createEntityManager();
        em.persist(this.polyPersistData);
        }

    }

}