两个表的JPA映射使用和何时使用jointable

时间:2014-04-09 15:23:18

标签: java hibernate jpa jointable

这更像是一个普遍的“理解”问题,而不是一个特定的Senario问题。

我一直在寻找JPA将表格映射到一起的方式,并发现这里有两个似乎以不同方式工作的例子。

有一个使用@JoinTable的一组Phone对象通过STUDENT_ID将STUDENT_PHONE加入STUDENT

另一个有一套StockDailyRecord,但似乎只是使用mappedby stock而在stock_detail表对象中有@PrimaryKeyJoinColumn注释。

只是想了解哪种方法是首选的方式和原因?

方法1:

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "STUDENT_PHONE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "PHONE_ID") })
public Set<Phone> getStudentPhoneNumbers() {
    return this.studentPhoneNumbers;
}

方法2:

@Table(name = "stock", catalog = "mkyongdb", uniqueConstraints = {
    @UniqueConstraint(columnNames = "STOCK_NAME"),
    @UniqueConstraint(columnNames = "STOCK_CODE") })


@OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
public Set<StockDailyRecord> getStockDailyRecords() {
    return this.stockDailyRecords;
}


@Table(name = "stock_detail", catalog = "mkyongdb")

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Stock getStock() {
    return this.stock;
}

1 个答案:

答案 0 :(得分:1)

方法#2:

它使用额外的列来构建OneToMany关系。此列是另一个表的外键列。在构建关系之前,如果需要将这些数据添加到数据库,则需要将此外键列定义为可空。这会破坏效率,无法提供规范化架构。

方法#1:

它使用第三个表,是在关系数据库中存储数据并提供规范化模式的有效方法。因此,如果在构建关系之前需要存在数据,那么最好使用这种方法。