【问题标题】:JPA Join table generated with primary keys instead of foreign keys使用主键而不是外键生成的 JPA 连接表
【发布时间】:2020-07-10 22:15:33
【问题描述】:

我在 TeamEntityContestTypeEntity 之间有一个 OneToMany 单向关系。

所以在我的TeamEntity 我有以下内容:

@OneToMany(targetEntity = ContestTypeEntity.class)
@JoinTable(name="team_contest_type")
private Set<ContestTypeEntity> contestTypes = new HashSet<>();

ContestTypeEntity 不知道这种关系。

通常,JPA 应该生成一个带有两个外键的连接表 team_contest_typeteam_entity_idcontest_types_id

但在实际生成的连接表中,这些是主键,所以我无法插入非唯一值......这就是我想要做的。 我该如何解决这个问题?

【问题讨论】:

  • 您想在可连接中插入非唯一值? jpa自动使用主键作为连接表的外键
  • 连接表的目的是提供唯一的对(team_entity_id, contest_types_id)。你为什么要“解决”这个问题?
  • Team可以关联多个ContestType,ContestType可以有多个Team;所以结果将是非唯一的对。我不知道该怎么做^^'
  • 对总是唯一的,例如 (1,1),(1,2),(2,1) 都可以,但 (1,1) 又不行。似乎多对多关系使用@ManyToMany
  • 我想要像 (1,1), (1,2), (2,1), (2,2) 这样的配对。对将是唯一的,但 id 可以多次使用

标签: java jpa spring-data-jpa


【解决方案1】:

使用 @JoinColumn 代替 @JoinTable。请记住,使用 JPA/Hibernate/ORM 时,您使用的是对象引用,而不是表键。 这可以帮助您不要在 OneToMany 中使用单向: https://thorben-janssen.com/best-practices-many-one-one-many-associations-mappings/#Don8217t_use_unidirectional_one-to-many_associations

【讨论】:

  • @JoinColumn 在比赛类型中创建了一个包含团队 ID 的列。但是一个 ContestType 可以有多个 Teams,所以这不是我想要的
【解决方案2】:

好的,所以两边都有一个 Set 的 ManyToMany 关系解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2017-12-04
    • 2015-02-03
    • 1970-01-01
    • 2022-08-17
    • 2010-12-21
    相关资源
    最近更新 更多