【问题标题】:JPA: @JoinTable - Both columns are Primary Keys.. How do I stop that?JPA:@JoinTable - 两列都是主键。我该如何阻止它?
【发布时间】:2011-09-30 20:40:29
【问题描述】:

这是我用来生成联接表的注释。

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "service_operations", 
        joinColumns = { @JoinColumn(name = "serviceId") },
        inverseJoinColumns = { @JoinColumn(name = "operationId") })
public Set<Operation> getOperations() {
    return operations;
}

考虑到这是一个 OneToMany 关联,我自然的假设是这个表会生成一个

[ 主键 | Foreign Key ] 表,但是每次我删除并重新创建数据库时,情况并非如此:

mysql> describe workflow_services;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| workflow_id | bigint(20) | NO   | PRI | NULL    |       |
| service_id  | bigint(20) | NO   | PRI | NULL    |       |
+-------------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

我对此有点困惑。有什么建议吗?

【问题讨论】:

  • Behrang 下面说的,加上:MySQL 的 describe 不显示外键;但workflow_idservice_id 绝对是各自桌子上的FK。此外,JPA 正确在此处的两列上定义了一个复合主键,即两列都是表 PK 的 一部分,并且每个列都是(的单个部分)a FK。

标签: jpa primary-key one-to-many jointable


【解决方案1】:

我通过添加以下更改解决了我的问题:

我将@OneToMany 更改为@ManyToMany 注释

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "workflow_services", 
        joinColumns = @JoinColumn(name = "workflow_id"), 
        inverseJoinColumns = @JoinColumn(name = "service_id"))
public Set<Service> getServices() {
    return services;
}

我添加了一套工作流程;我的服务对象中的关联

@ManyToMany(mappedBy="services")  // map info is in person class
public Set<Workflow> getWorkflows() {
    return workflows;
}

【讨论】:

    【解决方案2】:

    这对我来说是正确的。连接表中的每一行都应标识一对工作流/服务项。所以(workflow_id, service_id) 应该是主键。此外,workflow_id 应该是 workflow 表的外键,service_id 应该是 service 表的外键。

    另请注意,A 和 B 之间的一对多关联并不意味着 A 的实例可以多次具有 B 的相同实例,而是 A 的实例可以具有 B 的多个不同实例。例如博客Post 实体可以与Tag 实体建立一对多关联。这意味着一个博客PostP1可以有多个标签JavaJPAJavaEE,但不能有多个相同的标签。

    【讨论】:

    • 感谢您澄清这一点,但我仍然需要回答我的问题。我会转向@ManyToMany 注释还是我必须做的其他事情才能得到一个表格,结果是:[ 1 | 3 ] [ 1 | 4 ] [ 2 | 3 ]
    • @DreamsInStereo [1 | 3][1 | 4] 可以保留在当前表中,因为主键是 (1, 3)(1, 4),它们是唯一的。您可以拥有任意数量的关联:(1, 2)(1, 3)(1, 4)(1, 5)、...
    • 我不是在寻找唯一的服务 ID。我正在寻找指向同一服务的多个工作流。 workflow_id 列必须保持唯一,但 service_Id 列不能唯一。我是否要使用多对多来使第二个 FK 列不唯一?
    • 我相信我想要的是一个 workflow_id + service_id COMPOSITE 键,其中 service_id 不是主要的。
    猜你喜欢
    • 2012-01-24
    • 2016-08-16
    • 2012-07-28
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-06-16
    • 2013-01-31
    • 2016-04-26
    相关资源
    最近更新 更多