我在两个表之间有一对一的关系,但外键在我不需要映射的那个上,DBA这样做是为了支持未来的更改。让我们想象我们有用户和地址,今天每个用户只有一个地址,并且将以这种方式映射,但DBA相信未来它可能是一对多映射,所以用户的外键是在地址上,但应用程序有用户实例,这对于自动获取地址很重要。OneToOne双向映射外键自动填充
我们这样做是正确的,如下:
@Entity
@Table(name = "user")
class User {
@Id
@Column(name = "user_id")
private Long id;
//...
@OneToOne(cascade = CascadeType.MERGE, mappedBy = "user")
private Address address; // this attribute is crucial
}
@Entity
@Table(name = "address")
class Address {
@Id
@Column(name = "address_id")
private Long id;
@OneToOne
@JoinColumn(name = "user_id")
private User user; // this attribute is not needed for the business at all, but mappedBy requires it
//...
}
数据库:
-- SQL:
CREATE TABLE user
(
user_id INT NOT NULL,
-- ...
CONSTRAINT user_pk PRIMARY KEY (user_id)
);
CREATE TABLE address
(
address_id INT NOT NULL,
user_id INT NOT NULL,
-- ...
CONSTRAINT address_pk PRIMARY KEY (address_id),
CONSTRAINT address_user_id_fk FOREIGN KEY (user_id) REFERENCES user (user_id),
CONSTRAINT address_user_id_uk UNIQUE (user_id) -- it says it's a one to one relation for now, if in the future it won't be anymore, just remove this constraint
);
问题是,当保存的用户实例与地址的新实例,地址的用户的属性所以我期望Hibernate能够很聪明地将它设置为来自用户实例的值。
我一直在寻找一个解决方案几天,但仍然没有找到如何解决这个问题,同时我手动设置值,但我希望我不需要这样做。
我看到,我想知道Hibernate可以聪明地为我做,但这个解决方案是比设置用户创建地址的每一段代码更好。 –