@PrePersist插入查询

时间:2019-01-07 14:58:19

标签: jpa java-ee eclipselink hibernate-ogm

我处于以下情况:我有一个通过mysql中的JPA管理的实体。 PolyPersist类的某些字段存储在mysql表中,该实体(PolyPersistData)的单个字段(包含(相当大)数据)使用@PrePersist处理程序存储在MongoDB中。 因此,PolyPersist存储在mysql表(eclipselink)中,而字段PolyPersistData存储在MongoDB(hibernate-ogm)中。

@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);
        }

    }

}

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

1 个答案:

答案 0 :(得分:1)

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

  • EntityManager实例化
  • 事务处理同步且缓慢
  • 在处理程序中进行持久操作。

我相信最好的方法是将MySQL和MongoDB持久性完全隔离在不同的DAO /存储库中,并与上层或拦截器进行协调。实现的方式会因所使用的平台(Java SE / EE / Spring)而有所不同。

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