Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 在接口/抽象类上使用@NodeEntity_Neo4j_Spring Data_Spring Data Neo4j - Fatal编程技术网

Neo4j 在接口/抽象类上使用@NodeEntity

Neo4j 在接口/抽象类上使用@NodeEntity,neo4j,spring-data,spring-data-neo4j,Neo4j,Spring Data,Spring Data Neo4j,是否可以在接口或Abstract类或其字段上添加来自SpringData Neo4j的@NodeEntity(甚至@RelationshipEntity)注释?如果没有,您如何管理这些情况?@NodeEntity或@RelationshipEntity需要在POJO或具体类上定义。认为它与Hibernate中的@Entity相同。 但是,您是否看到任何用于注释接口或抽象类的有效用例?您肯定可以在抽象类上这样做,我认为在一些常见情况下,这是一种很好的做法。让我举一个我在图形模型中使用的示例: @N

是否可以在接口或Abstract类或其字段上添加来自
SpringData Neo4j
@NodeEntity
(甚至
@RelationshipEntity
)注释?如果没有,您如何管理这些情况?

@NodeEntity或@RelationshipEntity需要在POJO或具体类上定义。认为它与Hibernate中的@Entity相同。
但是,您是否看到任何用于注释接口或抽象类的有效用例?

您肯定可以在
抽象类上这样做,我认为在一些常见情况下,这是一种很好的做法。让我举一个我在图形模型中使用的示例:

@NodeEntity
public abstract class BasicNodeEntity implements Serializable {

   @GraphId
   private Long nodeId;

   public Long getNodeId() {
      return nodeId;
   }

   @Override
   public abstract boolean equals(Object o);

   @Override
   public abstract int hashCode();
}


public abstract class IdentifiableEntity extends BasicNodeEntity {

   @Indexed(unique = true)
   private String id;

   public String getId() {
      return id;
   }

   public void setId(String id) {
      this.id = id;
   }

   @Override
   public boolean equals(Object o) {
      if (this == o) return true;
      if (!(o instanceof IdentifiableEntity)) return false;

      IdentifiableEntity entity = (IdentifiableEntity) o;

      if (id != null ? !id.equals(entity.id) : entity.id != null) return false;

      return true;
   }

   @Override
   public int hashCode() {
      return id != null ? id.hashCode() : 0;
   }
}
实体可识别的示例

public class User extends IdentifiableEntity {
   private String firstName;
   // ...

   public String getFirstName() {
      return firstName;
   }

   public void setFirstName(String firstName) {
      this.firstName = firstName;
   }
}
OTOH,据我所知,如果你用
@NodeEntity
注释一个接口,那些实现接口的类不会继承注释。当然,我已经做了一个测试来检查它,并且肯定地
spring-data-neo4j
抛出了一个异常,因为我无法识别继承的类,既不能识别
NodeEntity
也不能识别
RelationshipEntity

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'neo4jMappingContext' defined in class org.springframework.data.neo4j.config.Neo4jConfiguration: Invocation of init method failed; nested exception is org.springframework.data.neo4j.mapping.InvalidEntityTypeException: Type class com.xxx.yyy.rest.user.domain.User is neither a @NodeEntity nor a @RelationshipEntity

希望它能有所帮助

此时脑海中出现了许多用例。例如,
@NodeEntity抽象类用户
;这样,您就知道扩展该类的每个类,例如
UserPerson
UserOrganization
,都始终是图中的一个节点。此外,如果您有常见的注释字段,例如简单的
@GraphId Long id
或与(…)私有集消息相关的更复杂的案例
@也很有用。管理这些案例的标准方法是什么?我还没有尝试过,但根据文档@NodeEntity是继承的,以防它是在接口或抽象类上定义的。-谢谢你的推荐,看起来很棒。您可以更新您的答案以反映您的新发现。我会等几天,看看其他用户是否有更好的解释和/或示例,但除此之外,这肯定是公认的答案。再次感谢您的帮助:)事实上,我开始在类上使用很多此类注释。作为旁注:我已经在很多项目中看到了
字符串id
的用法:这是为什么?它与
hash()
甚至
equals()
有关吗?欢迎光临!字符串Id是每个实体的唯一标识符。不能将@GraphId用作标识符,因为它们不会持久化()。在我的例子中,我使用UUID作为Id的
UUID.randomUUID().toString()
,并在将每个实体保存到BeforeSaveEvent之前生成它们。我的问题中有一个问题。希望这有助于回到原来的问题,在接口上使用@NodeEntity注释是否也很好?我的意思是,如果我有一个
@NodeEntity接口ComparableObject
和实现这个接口的其他实体,会怎么样?如果这些实体也被注释为
@NodeEntity
,该怎么办?请参见我的编辑@tigerjack89!似乎您不能在接口上使用它。要添加另一个有趣的点,虽然接口上的注释不是继承的(我认为这是继续tbh的正确方法),但是您可以轻松地将接口注释为实体,并在代码的任何部分使用它,只要实际的类也是相同类型的实体。但是,您必须将实现它们的接口和类都注释为@NodeEntity或@RelationshipEntity,否则spring框架将出现一个异常,即
MyClass[或MyInterface]既不是@NodeEntity也不是@RelationshipEntity