如何使用liquibase创建中间表?

时间:2019-06-11 12:55:36

标签: database spring spring-boot jpa liquibase

我有两个实体,我想创建一个与它们相关的表。

我想为这种关系建模:一个项目有很多工人,而一个工人只在一个项目中。我正在使用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。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  1. 您不需要关系表上的ID列,因为您可以将两个外键都用作主键。

  2. 现在,这两个实体之间具有一对多关系。

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