我的組物件有一組@DBRef 的用戶,每個用戶同樣有一組@DBRef 的組:
public class Group {
@Id
private String id;
@Indexed(unique = true)
private String name;
@DBRef(lazy=true)
private Set<User> users;
//...
}
public class User {
@Id
private String id;
@Indexed(unique = true)
private String email;
private String password;
private String role;
@DBRef(lazy = true)
private Set<Group> groups;
//...
}
當我洗掉一個用戶時,我當然必須將他從他的組中洗掉:
Set<Group> subscribedGroups = userRepository.findByEmail(email).getGroups();
for (Group g : subscribedGroups) {
Set<User> users = g.getUsers();
users.remove(user);
g.setUsers(users); // not sure if this line is necessary but it doesnt work regardless
groupRepository.save(g);
}
這不起作用。remove(user)由于某種原因回傳 false。它應該可以作業;我列印了每個成員的 ID users,然后是user.getId(),然后是結果remove(user):
List of users:
61abd6f1c81ab948c31641f2
User to delete: 61abd6f1c81ab948c31641f2
Result of removal: false
uj5u.com熱心網友回復:
您似乎已經習慣了 JPA,它使用各種奇妙的魔法手段來確保(在特定事務中)如果您多次看到相同的資料庫記錄,您會看到相同的 Java 物件,這意味著如果(例如)您User從 中檢索 aUserRepository然后在Set<User>其他地方看到 a ,您在兩個地方都有相同的物件。在這種情況下,Collection#remove會做你想做的。
MongoDB 支持不同:它只是將 POJO 映射為被動資料物件。這意味著除非您的物體類實作equalsand hashCode,否則集合實作(和其他任何東西)不會認為它們相等。您需要removeIf根據 ID執行類似操作。
(順便說一句,這就是為什么您需要repo.save(changed)使用大多數存盤庫實作進行呼叫,即使您沒有專門使用 JPA。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373348.html
標籤:爪哇 春天 MongoDB 弹簧数据 spring-data-mongodb
下一篇:關系未正確反序列化
