gpt4 book ai didi

java - 如何避免ManyToMany关系上的双向插入

转载 作者:行者123 更新时间:2023-12-01 15:12:17 26 4
gpt4 key购买 nike

我有两个具有 m:n 关系的表。当我从数据库中提取数据时,这种关系应该是双向的,因此,我需要在两个实体类中使用 @ManyToMany 。但是,同时,我需要非所有者类在对其执行持久或合并操作时不插入所有者类。

例如,我有 Gene 类,即所有者类,还有 Ontology 类。一个基因有多个本体,一个本体有多个基因。经典的多对多关系。如果我坚持或合并一个基因,我也想插入它的本体,但我不希望这个本体插入插入与其链接的所有其他基因。

另一方面,如果我插入一个本体,我不想插入与该本体相关的基因。

我一直在 @ManyToMany 上尝试使用大量 JPA 标签,但没有任何效果符合我想要的方式。

有人有解决这个问题的想法吗?

基因类

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = GeneTables.GENEINFO_HAS_ONTOLOGY,
joinColumns =
@JoinColumn(name = "GeneInfo_WID", referencedColumnName = "WID"),
inverseJoinColumns =
@JoinColumn(name = "Ontology_WID", referencedColumnName = "WID"))
private Set<Ontology> ontology;

本体类

@ManyToMany(cascade = CascadeType.REFRESH, mappedBy = "ontology")
private Set<GeneInfo> geneInfo;

我尝试了所有级联类型,甚至没有级联选项。结果是一样的。

执行此代码时出现此错误

EntityManager em = getEntityManager();
m.getTransaction().begin();
em.persist(ontology);
em.getTransaction().commit();

我有这个错误:

[EL Warning]: 2012-08-29 14:52:13.013--UnitOfWork(544628019)--java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST 

at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)

at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)

at org.jbiowh.core.datasets.ontology.controller.OntologyJpaController.create(OntologyJpaController.java:41)

at org.jbiowh.tools.prototypes.Test.main(Test.java:65)

已解决

我解决了这个问题。我创建 Controller 类来处理特殊的级联。

本体 Controller 类上的创建方法将是:

if (loadGeneFlag && ontology.getGene() != null && !ontology.getGene().isEmpty()) {
Set<Gene> geneSet = new HashSet<>();
GeneJpaController gController = new GeneJpaController(emf);
for (Gene gene : ontology.getGene()) {
Gene geneOnDB = em.find(Gene.class, gene.getWid());
if (geneOnDB != null) {
geneSet.add(geneOnDB);
} else {
gController.create(gene);
geneSet.add(em.getReference(Gene.class, gene.getWid()));
}
}
ontology.setGene(geneSet);
}

此代码将使用 Gene Controller 类创建所有基因引用,而不是遵循级联操作。这使我能够在 Gene Controller 类上正确处理 Gene 级联。现在,我没有任何重复的对象,也不异常(exception)。

最佳答案

这些基因从哪里来?

如果它们是新的,那么您需要保留它们,或者在基因关系上设置级联保留。如果它们存在,那么您需要在当前 EntityManager/事务的上下文中找到它们。

如果您不想持续存在,则不要将它们添加到基因集合中。

关于java - 如何避免ManyToMany关系上的双向插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12174806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com