gpt4 book ai didi

java - 删除与 Spring Data Neo4j 的关系

转载 作者:行者123 更新时间:2023-11-30 02:37:24 35 4
gpt4 key购买 nike

我使用 SDN 4 (v4.2.1)、Spring boot (1.5.2)、Neo4j (v3.1.0),无法使用 save() 方法删除简单关系。

@NodeEntity
public class A extends MyModel {

@Relationship(type="link")
private B b;

//Getters and setters
}

@NodeEntity
public class B extends MyModel {

@Relationship(type="link", direction=Relationship.INCOMING)
private List<A> as;

//Getters and setters
}

public interface ARepository implements GraphRepository<A> {

}

public interface BRepository implements GraphRepository<B> {

}

//Create relationship
A a a = ...;
B b = ...;
a.setB(b);
a = aRepository.save(a); // works
//Delete relationship
a.setB(null);
aRepository.save(a); // Not works

如何成功删除 A 和 B 中的关系?

编辑

谢谢您的回答。

以及如何在验证表单后执行此操作。

@PostMapping(FORM)
public String form(@Valid @ModelAttribute("object") A a, BindingResult result, Model model, RedirectAttributes att, HttpServletRequest request) {
log.info("/form");
if (result.hasErrors()) {
return form(model, a, request);
}
try {
// a.getB() is null and a.getId() isn't null
a = aService.save(a); // a.getB() isn't delete
if (a.getId() == null)
att.addFlashAttribute(MSG, a.getName() + " : create !");
else
att.addFlashAttribute(MSG, a.getName() + " : modify !");
} catch (Exception e) {
model.addAttribute(MSG, e.getMessage());
log.error(e.getMessage(), e);
return form(model, a, request);
}
return redirect(LISTE);
}

这里,我的对象不在 session 中,但id是由spring mvc填充的。b 是通过下拉列表选择的。

最佳答案

您上面定义的代码与项目不一样:

@Transactional
public void test() {
A a = new A();
a.setName("a1");
B b = new B();
b.setName("b1");
a.setB(b);
System.out.println(a);
System.out.println("id : "+a.getId());
A a2 = aRepo.save(a);
System.out.println(a2);
Long id = a2.getId();
System.out.println("id : "+id);

A a3 = new A();
a3.setId(id);
a3.setName("a2");
System.out.println(a3);
aRepo.save(a3);
System.out.println(aRepo.findOne(id)); // b must be null
}

这里发生了很多事情,所以让我们先尝试将其分解。

  1. 创建一个新的 A,并在变量 a 中将其关联到一个 B
  2. 然后,
  3. a 被保存到数据库,并且 a 的副本作为 a2 返回。在此阶段,aa2 将具有相同的内部图 id 集 (a.id == a2.id)
  4. 创建了一个名为 a3 的新对象。上一步中的内部图形 ID 设置在 a3(又名 @GraphId)上,并将其保存到数据库中,没有 B 引用。
  5. 从数据库中检索与 a2 具有相同 idA

让我们仔细看看每一步中到底发生了什么。

  1. 尚未与 OGM/SDN 进行互动。
  2. 此时,a 及其 B 引用已保存到数据库中。 OGM/SDN 中的缓存现在保存 a 以及指向 b 的链接以及数据库分配的内部 Neo4j ID(保存在 id 中) > 每个对象的字段)。 a 的引用副本被分配给 a2
  3. 目前尚未与 OGM/SDN 进行交互。在调用 save() 之前,OGM 不会管理这个新对象。此时事情变得不确定。通过尝试在对象上设置内部 id,OGM 会丢弃它,因为它没有“附加”,而是使用 Session 中的缓存值。

需要注意的是,永远不应该真正更改 @GraphId 的值。事实上,它真的不应该在设计方面暴露出来,因为它不是一个可变的属性。

要解决您的问题,只需使用从 session 中检索到的值,而不是实例化新对象并尝试关联先前调用的状态。

关于java - 删除与 Spring Data Neo4j 的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42696967/

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