gpt4 book ai didi

java - spring data mongodb 无法在没有设置 id 的情况下对子对象执行级联保存

转载 作者:可可西里 更新时间:2023-11-01 10:43:01 25 4
gpt4 key购买 nike

我正在使用 @CascadeSave将子对象保存在单独的集合中。我的文档类是:

public class FbUserProfile{

@Id
private long id;

@DBRef(lazy=true)
@CascadeSave()
private Set<FacebookFriend> friends;

@DBRef(lazy=true)
@CascadeSave()
private Set<FacebookFriendList> customFriendList;
}

public class FacebookFriend{
@Id
private long id;
private String name;
}

public class FacebookFriendList{

@Id
private long id;
private String name;
private String list_type;
}

我在两个 friend 中都添加了一些对象,customFriendList。并尝试使用以下方法更新 fbUserProfile 对象:

mongoTemplate.save(fbUserProfile);

note: fbUserProfile already exists in db. Now I am updating this

Error Message: Cannot perform cascade save on child object without id set

如果我删除@CascadeSave。这对我来说可以。我如何级联设置对象。我也将 @CascadeSave 与其他对象一起使用。它工作正常,但它们不是设置对象。

最佳答案

我在其他地方找到了相同的教程:Baeldung的和JavaCodeGeeks (这是我关注的那个)

我遇到过同样的问题,我可以解决它。

当您尝试持久化集合时会发生这种情况。集合的项目是否有@Id 并不重要,因为集合本身不会有它。我编辑了 EventListener 的 onBeforeConvert 中的代码,以检查您尝试 CascadeSave 的字段是否是一个集合(在我的例子中是一个列表)。如果它是一个列表,您只需循环检查每个项目的@Id 并保存它们。

如果它不是一个集合,你仍然必须像以前一样持久化它们

@Override
public void onBeforeConvert(Object source) {
ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() {

@Override
public void doWith(Field field)
throws IllegalArgumentException, IllegalAccessException {
ReflectionUtils.makeAccessible(field);

if (field.isAnnotationPresent(DBRef.class) && field.isAnnotationPresent(CascadeSave.class)){
final Object fieldValue = field.get(source);

if(fieldValue instanceof List<?>){
for (Object item : (List<?>)fieldValue){
checkNSave(item);
}
}else{
checkNSave(fieldValue);
}
}
}
});
}

private void checkNSave(Object fieldValue){
DbRefFieldCallback callback = new DbRefFieldCallback();
ReflectionUtils.doWithFields(fieldValue.getClass(), callback);

if (!callback.isIdFound()){
throw new MappingException("Oops, something went wrong. Child doesn't have @Id?");
}

mongoOperations.save(fieldValue);
}

关于java - spring data mongodb 无法在没有设置 id 的情况下对子对象执行级联保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167752/

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