पहली परिभाषा

बस, मेरे पास 2 इकाई है, पहला उपयोगकर्ता है और दूसरा पता है, प्रत्येक उपयोगकर्ता के पास एक या अधिक पते हो सकते हैं। इसका मतलब है, मैं उपयोगकर्ता और पते के बीच द्विदिश 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")
@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)

}

बीटीडब्ल्यू, मैं डीएओ परत के लिए स्प्रिंग-डेटा-जेपीए और हाइबरनेट का उपयोग करता हूं।

3
Mehrdad HosseinNejad Yami 8 सितंबर 2019, 12:38

1 उत्तर

सबसे बढ़िया उत्तर

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.
}
0
Hülya 8 सितंबर 2019, 22:02