【问题标题】:JPA - @ManyToMany with duplicate reference to the same foreign keyJPA - @ManyToMany 重复引用相同的外键
【发布时间】:2018-04-09 09:11:27
【问题描述】:

我有 3 个这样的实体:

@Entity
public class A {

    @Id
    private String id;

}

@Entity
@IdClass(B.BPK.class)
public class B {

    @Id
    private String id;
    @Id
    @ManyToOne
    private A a;

}

@Entity
public class C {

    @Id
    private int refOne;
    @Id
    private int refTwo;    
    @Id
    private A a;
    @ManyToMany
    private Set<B> bs;

}

我有一个关于为实体 C 的关系 @ManyToMany 生成的表的问题。生成了 5 列:refOne、refTwo、a_id、b_id、b_a_id。

如您所见,a_id 和 b_a_id 是同一列上的外键,在我的模型中,a_id 不可能与 b_a_id 不同。

有没有不重复列的解决方案?

编辑:

我坚持这一点,A是C的id的一部分,C中的bs可以是空的。

我想了几个解决方案,但没有一个是真正令人满意的:

  • 使用使用 b_id 和 a_id 的转换器来恢复 bs 实体
  • 我尝试像这样使用@JoinTable 管理列:

JoinTable 方法:

@JoinTable(name = "bs", joinColumns = {
            @JoinColumn(name = "refOne", referencedColumnName = "refOne"),
            @JoinColumn(name = "refTwo", referencedColumnName = "refTwo"),
            @JoinColumn(name = "a_id", referencedColumnName = "a_id")
    }, inverseJoinColumns = {
            @JoinColumn(name = "b_id", referencedColumnName = "b_id"),
            @JoinColumn(name = "b_a_id", referencedColumnName = "b_a_id", insertable = false, updatable = false)

但我面临这些问题Mixing insertable and non insertable columns in a property is not allowed orParameter index out of range` })

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    由于 C 已经引用了 A,因此您可以获取 A.bs,而无需在 C 中声明 bs 的集合。但是,您需要在实体 A 中有一个 Set&lt;B&gt;

    当然,除非您不能更改映射...

    【讨论】:

    • 在我的模型中,A 中的 bs 没有任何意义。 :)
    • 一般来说,如果B引用A,那么A可以引用B的集合……如果你说的“意义”和你的应用模型有关,你可能是对的,我无法反驳
    • 是的,它是一个应用程序模型“约束”。事实上,A 是一个非常重要的对象,因为它经常被使用,所以我必须尽可能让它更轻。
    • 那么,@XtremeBaumer 的解决方案可能对您来说是一个更好的解决方案。或者对集合使用惰性初始化,仅在必要时获取它
    【解决方案2】:

    您可以使用引用b_a_id@JoinColumn 注释private A a;。还有其他注释可以让您更多地配置映射。然而,拥有 2 个包含相同值的 FK 列没有问题。


    此外,您应该始终手动创建表格。不要让它在生产中生成。


    更多信息请阅读docs。也许您必须搜索更具体的问题,但资源在那里

    【讨论】:

    • 但正如你所见,C 中的 A 是密钥的一部分。 bs 可以为空。我编辑我的帖子。
    • 然后将@JoinColumns 添加到您的@ManyToMany 中,它引用a_idb_id
    猜你喜欢
    • 2018-11-09
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2016-06-05
    • 2021-12-13
    相关资源
    最近更新 更多