gpt4 book ai didi

java - OneToOne双向映射外键自动填充

转载 作者:行者123 更新时间:2023-11-30 08:10:46 25 4
gpt4 key购买 nike

我有两个表之间的一对一关系,但外键在我不需要映射的表上,DBA 这样做是为了将来的更改。

假设我们有User和Address,今天每个用户只有一个地址,会这样映射,但是DBA相信 future 可能是一对多的映射,所以user的外键在地址,但应用程序有用户实例,这对于自动获取地址很重要。

我们做对了,如下:

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

问题是当用一个新的地址实例保存一个用户实例时,地址的用户属性是null,所以我期望Hibernate足够聪明,可以将它设置为用户的值它来自的实例。

这几天一直在找解决办法,还是没有找到解决方法,同时我是手动设置这个值,但我希望我不需要这样做。

最佳答案

标准解决方案是正确更新 bidirectional association 的两侧(尽管只有拥有方需要更新才能将关联保存到数据库中)。添加到 User 类中的 Address setter:

public void setAddress(Address address) {
this.address = address;
address.setUser(this);
}

此外,您可能希望扩展 address 属性的级联选项以包括 PERSIST,以便它始终与其用户一起持久化:

 @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "user")
private Address address;

然后您可以为用户设置一个地址并保留两者:

user.setAddress(address);
session.persist(user);

关于java - OneToOne双向映射外键自动填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com