我有两个实体,我想创建一个与它们相关的表。
我想为这种关系建模:一个项目有很多工人,而一个工人只在一个项目中。我正在使用JPA和Spring-boot。
@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne
private Worker worker;
// Getters & setters...
}
@Entity
public class Worker{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Getters & setters...
}
有了这个,我有两个表,一个叫“ Project”,另一个叫“ Worker”。现在,我想创建一个中间表,该表具有项目的ID和该项目中的工作人员的ID作为列,以了解在哪个项目中工作的是哪些工作人员,一旦有了,我可以将项目重新分配给一个特别工人。例如,我想要下表:
关系表(不同的工人可以在同一项目中工作):
| ID | ID_PROJECT | ID_WORKER |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
工人:
| ID | ID_WORKER |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
项目:
| ID | ID_PROJECT |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
我正在使用H2数据库。另外,我正在处理liquibase。
非常感谢您的帮助!
答案 0 :(得分:0)
您不需要关系表上的ID列,因为您可以将两个外键都用作主键。
现在,这两个实体之间具有一对多关系。
@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToMany
private List<Worker> workers = new ArrayList<>();
// Getters & setters...
}
然后,这取决于您如何命名关系表。 如果您将其命名为project_worker,则无需执行任何操作。
否则,您可能需要@JoinTable注释:
@JoinTable(
name="<name-of-the-relation-table",
joinColumns=
@JoinColumn(name="PROJECT_ID", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="WORKER_ID", referencedColumnName="ID")
)