亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當孩子更新時如何更新jpa中雙向關系所有者的fk

當孩子更新時如何更新jpa中雙向關系所有者的fk

qq_笑_17 2023-07-19 16:02:30
第一個定義簡單地說,我有兩個實體,第一個是用戶,第二個是地址,每個用戶可以有一個或多個地址。這意味著,我想要用戶和地址之間的雙向 OneToMany 關系。問題我有一個具有 3 個地址的用戶(具有 3 個地址列表的用戶),當我更新用戶并刪除一些地址(具有 2 個地址列表的用戶)時,保存用戶后,地址的 fk 不會更新。我預計更新后我的新用戶有 2 個地址,但地址并未更改。簡而言之:當我從用戶更新地址表的列表時,地址表的 fk 沒有更新。用戶實體(只寫地址字段)@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")@JsonManagedReferenceprivate 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")@JsonBackReferenceprivate User user;public User getUser() {    return user;}public void setUser(User user) {    this.user = user;}}服務等級@Servicepublic class UserService@AutowiredUserRepository 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)}順便說一句,我使用 Spring-data-jpa 和 Hibernate 作為 DAO 層。
查看完整描述

1 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

通過在實體removeAddress中添加方法User,您可以更新表的fk address,也可以保留行:


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.

}


查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號