gpt4 book ai didi

java - 更新子项时如何更新jpa中双向关系所有者的fk

转载 作者:行者123 更新时间:2023-11-30 12:03:19 25 4
gpt4 key购买 nike

第一个定义

简单地说,我有 2 个实体,第一个是用户,第二个是地址,每个用户都可以有一个或多个地址。这意味着,我想要用户和地址之间的双向 OneToMany 关系。

问题

当我更新我的用户并删除一些地址(具有 2 个地址列表的用户)并在保存用户之后,我有一个具有 3 个地址的用户(具有 3 个地址列表的用户),然后保存用户,地址的 fk 是没有更新。

I expect my new user has 2 addresses after the update but the addresses weren't changed.

In Brief: Address table's fk is not updated when I update a list of it from User.

用户实体(只写地址字段)

@Entity
@Table(name = TABLE_NAME)

public class User {

public static final String TABLE_NAME = "User";

//Some Fields Like ID , name ,...

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
@JsonManagedReference
private List<Address> addresses;

public List<Address> getAddresses() {
return addresses;
}

public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
}

地址实体(只写用户字段)

@Entity
@Table(name = TABLE_NAME)

public class Address {
public static final String TABLE_NAME = "ADDRESS";

//Some Fields Like ID , name ,...

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

服务等级

@Service
public class UserService

@Autowired
UserRepository repository;

public updateUserAddress() {

//Get User With Id of 1
User user = repository.findById(1L);

//Get Addresses
List<Address> addresses = user.getAddresses();

//Delete One Address From List
addresses.remove(0);

//Set New Address to User Entity
user.setAddresses(addresses);

//Save User
repository.save(user)

//It doesn't work (List of Address of user is the same and not changed)

}

顺便说一句,我在 DAO 层使用 Spring-data-jpa 和 Hibernate。

最佳答案

通过在 User 实体中添加 removeAddress 方法,您可以更新 address 表的 fk,并且您还可以保留该行:

public void removeAddress(Address address) {
address.setUser(null); // or the value you want
}

updateUserAddress 方法应该是这样的:

public void updateUserAddress() {

User user = repository.findById(1L);
List<Address> addresses = user.getAddresses();

Address address = addresses.get(0); //the address to be removed
user.removeAddress(address);

user.setAddresses(addresses);

repository.save(user);

}

用户实体:

@Entity
@Table(name = "users")
public class User {
// other fields

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch=FetchType.EAGER)
@JsonManagedReference
private List<Address> addresses;

// getters, setters, constructors etc.

// the remove method
public void removeAddress(Address address) {
address.setUser(null);
}
}

地址实体:

@Entity
@Table(name = "address")
public class Address {
// other fields

@ManyToOne
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;

// getters, setters, constructors etc.
}

关于java - 更新子项时如何更新jpa中双向关系所有者的fk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57840780/

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