我知道它@JoinColumn用于創建外鍵列,但我的問題有點不同。我注意到如果我有主物體mapped by和依賴物體沒有@JoinColumn,那么休眠無論如何都會正確創建兩個表。
例如,我有 Passport 和 Person:
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NonNull
private String name;
@NonNull
private int age;
@OneToOne(mappedBy = "person")
Passport passport;
}
護照物體:
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Entity
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NonNull
private int series;
@NonNull
private int number;
@OneToOne
// @JoinColumn(name = "person_id") //with or without this line the hibernate creates person_id in the Passport table
@ToString.Exclude
Person person;
}
在這兩種方式中(有或沒有@JoinColumn 注釋)hibernte 創建以下表格:
人員表:
###################
id ## name ## age #
###################
護照表:
#####################################
id ## series ## number ## person_id #
#####################################
那么如果沒有區別,@JoinColumn 注釋的意義何在?
uj5u.com熱心網友回復:
@JoinColumn表示該物體是關系的所有者,對應的表有一個列,該列具有參考表的外鍵。
@JoinColumn注釋不是強制性的。如果您不指定它,框架將改為執行默認配置。Hibernate 和 JPA 遵循約定優于配置。這意味著開發人員只需要指定一些自定義定義的非標準方面。
在 的情況下@JoinColumn,將生成默認列名,如:[field_name]_[id_column_name]。
在您的情況下:
[field_name]- 是物體
person欄位。- 是相關物體的列。它是物體的領域。Passport[id_column_name]@IdidPerson
根據檔案:
2.2.5。映射物體關聯/關系
如果沒有在所有者端宣告@JoinColumn,則應用默認值。將在所有者表中創建一個連接列,其名稱將是所有者側的關系名稱、_(下劃線)和所擁有的主鍵列的名稱的串聯邊。
因此,如果您需要覆寫默認約定,那么這正是@JoinColumn它的用途。
它涵蓋:
- 指定外鍵列的名稱
- 指定此外鍵列參考的列名
- 指定列定義
- 指定或控制外鍵定義的生成
- 指定包含該列的表的名稱
- 屬性是否為唯一鍵
- 該列是否包含在持久性提供程式生成的 SQL UPDATE 陳述句中
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/473488.html
