//Address不包含任何到User的信息
//使用optional=false,確定addr非空,這樣hibernate不用檢查addr是否為空,才能使用懶加載
//使用@PrimaryKeyJoinColumn使用Address的主鍵作為User的外鍵以及主鍵
//添加時需要先添加Address再添加User,並手動設置user.setId(addr.getId())
@Entity
class User{
//不指定生成策略
@Id
private long id;
@OneToOne(
fetch = FetchType.LAZY,
optional = false)
@PrimaryKeyJoinColumn
private Address addr;
}
//表結構
| user |address|
|id<pk><fk_from_address_id>|id|
@Entity
class User{
@Id
@GeneratedValue(generator = "addressKeyGenerator")
@org.hibernate.annotations.GenericGenerator(
name = "addressKeyGenerator",
strategy = "foreign",
parameters =
@org.hibernate.annotations.Parameter(
name = "property", value = "addr"
)
)
private long id;
@OneToOne(
fetch = FetchType.LAZY,
optional = false)
@PrimaryKeyJoinColumn
private Address addr;
}
@Entity
class Address{
@Id
@GeneratedValue
private long id;
@OneToOne(
mappedBy = "addr",
cascade = CascadeType.PERSIST)
private User user;
}
//表結構
| user |address|
|id<pk><fk_from_address_id>|id|
- 不共享主鍵只要將@PrimarKeyJoinColumn改為@JoinColumn,並各自指定生成策略即可。
表結構
| user |address|
| id | id |
|a_id<fk>| - |
- 通過將@JoinColumn改為@JoinTable,可以使用關聯表進行關聯。
@Entity
public class Shipment {
@OneToOne(fetch = FetchType.LAZY)
@JoinTable(
name = "ITEM_SHIPMENT",
joinColumns = @JoinColumn(name = "SHIPMENT_ID"),
inverseJoinColumns = @JoinColumn(
name = "ITEM_ID",
nullable = false,
unique = true)
)
protected Item auction;
// ...
}