@PrePersist 插入查询
@PrePersist insert query
我处于以下场景:我在 mysql 中有一个通过 JPA 管理的实体。 PolyPersist
class 的某些字段存储在 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" 这些实体(PolyPersist
和 PolyPersistData
)的生命周期不是最佳实践。
此外,在该处理程序中实例化 EntityManager 肯定是个问题(据我所知,我应该限制 EntityManager 实例,因为它们占地面积很大computationally/memory)。
哪种方法最好?
如您所述,此实现存在一些问题。其中一些是:
- EntityManager实例化
- 事务处理同步且缓慢
- 在处理程序中持久化操作。
我相信最好的方法是将MySQL和MongoDB持久性完全分开DAO/Repositories,并从上层或拦截器。实施将根据所使用的平台而有所不同 (Java SE/EE/Spring)。
我猜你根本不需要 MongoDB。删除 MongoDB 会使解决方案更简单。您可以使用自定义表空间或其他数据库级别的技巧来处理 MySQL 中的实体大小问题。
我处于以下场景:我在 mysql 中有一个通过 JPA 管理的实体。 PolyPersist
class 的某些字段存储在 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" 这些实体(PolyPersist
和 PolyPersistData
)的生命周期不是最佳实践。
此外,在该处理程序中实例化 EntityManager 肯定是个问题(据我所知,我应该限制 EntityManager 实例,因为它们占地面积很大computationally/memory)。
哪种方法最好?
如您所述,此实现存在一些问题。其中一些是:
- EntityManager实例化
- 事务处理同步且缓慢
- 在处理程序中持久化操作。
我相信最好的方法是将MySQL和MongoDB持久性完全分开DAO/Repositories,并从上层或拦截器。实施将根据所使用的平台而有所不同 (Java SE/EE/Spring)。
我猜你根本不需要 MongoDB。删除 MongoDB 会使解决方案更简单。您可以使用自定义表空间或其他数据库级别的技巧来处理 MySQL 中的实体大小问题。