1

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

@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)

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

4

2 回答 2

4

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

我将 @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;
}
于 2011-10-03T15:29:21.843 回答
2

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

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

于 2011-09-30T20:46:09.917 回答