我处于以下情况:我有一个通过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);
}
}
}
我知道这不是“跨越”这些实体(PolyPersist
和PolyPersistData
)生命周期的最佳实践。
同样,在该处理程序中实例化EntityManager肯定是一个问题(据我所知,我应该限制EntityManager实例,因为它们的计算/内存占用量很大)。
哪种方法最好?
答案 0 :(得分:1)
正如您提到的,此实现存在一些问题。其中一些是:
我相信最好的方法是将MySQL和MongoDB持久性完全隔离在不同的DAO /存储库中,并与上层或拦截器进行协调。实现的方式会因所使用的平台(Java SE / EE / Spring)而有所不同。
我想您根本不需要MongoDB。删除MongoDB将使解决方案更加简单。您可以使用自定义表空间或其他数据库级别的技巧来处理MySQL内部的实体大小问题。