Spring Data Neo4J引用相关节点,保存时不覆盖

elcex8rz  于 2022-10-01  发布在  Spring
关注(0)|答案(1)|浏览(169)

我正在努力地写这篇文章,所以我可能不得不举一个例子来帮助解释我所遇到的问题。

假设我们有三种类型的节点(这些节点可能有更多自己的关系,例如,产品系列、有产品经理):

  • 产品
  • 产品系列
  • 电池

有了这些关系

  • 一款产品可以在0个或多个系列中
  • 一个产品可以有0个或更多电池。

在使用Spring-data-new 4j和保存新产品时,我希望包括这些关系,例如它们所需的电池和它们所属的产品系列。但是,如果我只提供一个ID,而不是一个完全填充的对象,它将相应地覆盖该对象以及属性和关系。

这并不是很好,因为这意味着每次我希望保存一些东西时,我都必须发送一个完全填充的对象,以及它的所有关系,其中一些关系可能会非常深入。

我的域名如下:

@Node
public class Product {

   @Id
   @GeneratedValue(generatorClass = SnowflakeGenerator.class)
   private Long productId;

   private String name;

   @Relationship(type = "REQUIRES_BATTERY", direction = OUTGOING)
   private List<Battery> batteryList;

   @Relationship(type = "IN_FAMILY", direction = OUTGOING)
   private List<ProductFamily> productFamilyList;
}

@Node
public class Battery {

   @Id
   @GeneratedValue(generatorClass = SnowflakeGenerator.class)
   private Long batteryId;

   private String name;
}

@Node
public class ProductFamily {

   @Id
   @GeneratedValue(generatorClass = SnowflakeGenerator.class)
   private Long familyId;

   private String name;
}

这很可能源于关系型数据库的思维方式,也是使用Neo4J的“局限性”。

TLDR使用Spring Data 在Neo4J中持久化某项内容时,如何仅保存关系,而不是整个相关节点。

deyfvvtc

deyfvvtc1#

您可以使用Spring data Neo4j中的投影。(https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#projections)这为您提供了在对象树上放置“掩码”的选项,您想要持久化(以及应该保持不变)。

例如,在您的案例中:

interface ProductProjection {
  // without defining e.g. String getName() here, SDN would not ever touch this property.
  List<BatteryProjection> getBatteryList();
  List<ProductFamilyProjection> getProductFamilyList();
}
interface BatteryProjection {
  String getName();
}
interface ProductFamilyProjection {
  String getName();
}

相关问题