gpt4 book ai didi

java - 如何将 @ManyToMany 与同一个表上的两个列表一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:09 25 4
gpt4 key购买 nike

我有这样一种情况,一个实体可以使用另一个实体,它可以被另一个实体使用,所以我定义了一个引用同一个实体的 ManyToMany 关系,所以我可以有 listUse 和 listUsedBy,并且两者都保存在同一张表 entity_usage :

@ManyToMany
@JoinTable(name = "entity_usage",
joinColumns = {
@JoinColumn(name = "id_use", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "id_used_by", referencedColumnName = "id")})
private List<Entity> listUse;

@ManyToMany
@JoinTable(name = "entity_usage",
joinColumns = {
@JoinColumn(name = "id_use_by", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "id_use", referencedColumnName = "id")})
private List<Entity> listUsedBy;

示例:实体A可以使用实体BC,所以实体BCA 使用。现在我的问题是,当我将 B 和 C 添加到 listUse 时,它​​们会保留在 entity_usage 中,但是当尝试显示 listUsedBy 时,我必须重新部署我的项目,否则 listUsedBy 仍然为空,有没有办法在保留我的实体时刷新 listUsedBy 而无需重新部署我的项目。

最佳答案

这是一般方法:

@Entity
public class SomeEntity
{
@ManyToMany
@JoinTable(name = "entity_usage",
joinColumns = @JoinColumn(name = "using_id"),
inverseJoinColumns = @JoinColumn(name = "used_by_id"))
private Set<SomeEntity> using = new LinkedHashSet<>();

@ManyToMany(mappedBy = "using")
private Set<SomeEntity> usedBy = new LinkedHashSet<>();

public void addUsing(SomeEntity entity)
{
this.using.add(entity);
entity.usedBy.add(this);
}

public void addUsedBy(SomeEntity entity)
{
this.usedBy.add(entity);
entity.using.add(this);
}
}

它被使用:

public void someMethod(long parentEntityId, long childEntityId)
{
EntityManager em = getSomeEntityManager();

SomeEntity parentEntity = em.find(SomeEntity.class, parentEntityId);
SomeEntity childEntity = em.find(SomeEntity.class, childEntityId);

parentEntity.addUsing(childEntity);
}

通常这是一个事务性 EJB 方法。
请注意,不需要 em.merge 任何东西,因为实体已经由 em.find 管理。无论如何,无论您使用哪种方法来管理您的实体(查询、查找、保留、合并),请记住调用 addUsing/addUsedBy重要> 仅当两个实体都被管理时

这是 ORM 逻辑无法自行处理的主要不连贯性之一:您必须将它们的关系告知两个实体(父和子)
设置只有一方面的关系——如果你只说 A 是 B 的父级,B 仍然不知道谁是它的父级。

但是,存在替代方法,例如仅设置关系的拥有方 (parent.getChildren().add(child))、刷新和刷新子项。

尽管如此(因为我的皮肤体验非常好)在现实世界的复杂应用程序中很难处理替代方案。

作为旁注,我将使用 Set 而不是 List 来表示关系,除非您需要某种插入顺序。

关于java - 如何将 @ManyToMany 与同一个表上的两个列表一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44516878/

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