@PrePersist 插入查询

@PrePersist insert query

我处于以下场景:我在 mysql 中有一个通过 JPA 管理的实体。 PolyPersistclass 的某些字段存储在 mysql table 中,该实体 (PolyPersistData) 的单个字段包含(相当大的)数据使用 @PrePersist 处理程序存储在 MongoDB 中。 因此,PolyPersist 存储在 mysql table (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);
        }

    }

}

我知道 "crossing" 这些实体(PolyPersistPolyPersistData)的生命周期不是最佳实践。 此外,在该处理程序中实例化 EntityManager 肯定是个问题(据我所知,我应该限制 EntityManager 实例,因为它们占地面积很大computationally/memory)。 哪种方法最好?

如您所述,此实现存在一些问题。其中一些是:

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

我相信最好的方法是将MySQL和MongoDB持久性完全分开DAO/Repositories,并从上层或拦截器。实施将根据所使用的平台而有所不同 (Java SE/EE/Spring)。

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