当前位置: 首页 > 知识库问答 >
问题:

如何使用spring-data-neo4j-cross-store支持@RelatedTo-like跨存储持久化?

牧梓
2023-03-14

我试图使用neo4j交叉存储持久性的数据结构是多少设置。在jpa和neo4j之间的边界,它包含一个引用jpa实体的NodeEntity。因此neo4j对象只包含jpa-对象的id作为引用。

在mongodb交叉存储persistence和neo4j持久性的混合语法中,这可能如下所示:

@NodeEntity    
public class MyNode {
  @GraphId
  Long id;

  @RelatedTo
  MyEntity entity;

  ... //setters and setters omitted
}

@Entity
public class MyEntity {
  @Id @GeneratedValue
  Long id;

  String name;

  ... //getters and setters omitted
}

似乎这种跨存储持久性在sping-data-neo4j中是不可能的。唯一支持的表单似乎是使用@NodeEntity("part=true"),这需要一个jpa表,其ID与包含jpa id的neo4j对象相同。

现在,在我看来,实现类似这样的功能的一种可行方法是拦截neo4j的检索和保存,例如:

  • 当加载时,jpa对象通过读取neo4j id字段并将jpa beojct注入(neo4j瞬态)字段来加载
  • 保存时,jpa对象被保存,id被保存到neo4j id字段

那么我对sping-data-neo4j的能力的看法是不是错了?

这似乎是一种可行的方法吗?

有没有办法向spring-data-neo4j添加一个过滤器?不知怎么的,我在上面找不到任何东西。或者,在spring数据甚至spring级别上是否有可能进行过滤,这可能会有所帮助?

我并不是一个真正的spring专家,所以任何提示都可能有帮助。

共有1个答案

居飞扬
2023-03-14

我不知何故解决了这个问题。

我使用Spring的转换器和ConverterFactory的可能性隐式地从我的@Entity对象转换为Long,反之亦然。

@NodeEntity如下所示(代码在Scala中,但与Java没有相关的区别):

@NodeEntity
class ImplicitUser {
  @GraphId
  var id: java.lang.Long = _

  @Indexed(indexName="username", indexType=IndexType.FULLTEXT)
  var username : String = _

  @GraphProperty(propertyType = classOf[java.lang.Long])
  var person : Person = _

  override def toString =
    "User %d %s".format(id, username)
}

有关部分包括:

  @GraphProperty(propertyType = classOf[java.lang.Long])
  var person : Person = _

因为这告诉neo4j将该字段保留为Long,尝试找到Spring转换器。因此,需要定义Spring转换。为了考虑到这一点,我定义了一个特性,它将JPA@Entity定义为具有Long id:

trait JpaLongId {
  @Id @GeneratedValue
  var id: Long = -1
}
class JpaLongIdToLong extends Converter[JpaLongId, java.lang.Long] {
  def convert(source : JpaLongId) : java.lang.Long = {
    long2Long(source.id)
  }
}

另一方面,我必须定义一个工厂,以允许EntityManager的DI:

@Component
class LongToJpaLongIdFactory extends ConverterFactory[java.lang.Long, JpaLongId] {
  def getConverter[T <: JpaLongId](`type`: Class[T]): Converter[java.lang.Long, T] = {
    return new LongToJpaLongId(`type`, em)
  }

  @PersistenceContext
  var em: EntityManager = null
}

class LongToJpaLongId[T <: JpaLongId] extends Converter[java.lang.Long, T] {
  private var `type`: Class[T] = null
  private var em: EntityManager  = null

  def this(`type`: Class[T], em: EntityManager) {
    this()
    this.`type` = `type`
    this.em = em
  }

  def convert(key: java.lang.Long): T = {
    return em.find(`type`, key)
  }
}

最后,我不得不在Spring上下文中注册这些转换器:

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="at.granul.spring.jpa.LongToJpaLongIdFactory"/>
            <bean class="at.granul.spring.jpa.JpaLongIdToLong"/>
        </list>
    </property>
</bean>

就这样!现在很容易定义这种“RealtedTo”风格的关系。

欢迎提出意见和想法。

 类似资料:
  • 问题内容: 我正在尝试运行一个非常小的JPA + SDN(Spring Data Neo4j)跨存储项目,并试图演示使用JPA存储库调用保存部分实体将在Neo4j中创建一个相应的节点。 我遵循了在SO,Google和Spring的网站上可以找到的指示/建议,但目前仍然难以解决问题。我目前在以下位置创建了一个最小的测试项目: https://github.com/simon-lam/sdn-cros

  • Spring Data Neo4j是否支持匿名类的持久性?我设法持久化了一个匿名类的对象,但是当试图创建索引(通过注释)时,出现了问题——在SDN 2.3.4中。释放我不能得到唯一的索引工作,在3.0.0.释放我得到了一个错误: 我有一个抽象的用户类,它是Person和Company的子类。但是在创建fresh数据库时,我想创建一个管理员用户,对于这个用户,我认为(可能是错误的)不需要创建不同的域

  • 本文将指导您如何在Kubernetes集群上安装OpenEBS作为持久化存储。 我们将使用Operator的方式来安装OpenEBS,安装之前需要先确认您的节点上已经安装了iSCSI。 先决条件 OpenEBS依赖与iSCSI做存储管理,因此需要先确保您的集群上已有安装openiscsi。 注意:如果您使用kubeadm,容器方式安装的kublet,那么其中会自带iSCSI,不需要再手动安装,如果

  • 本文中用到的 yaml 文件可以在 ../manifests/mariadb-cluster 目录下找到。 下面我们以部署一个高可用的 MySQL 集群为例,讲解如何使用 Ceph 做数据持久化,其中使用 StorageClass 动态创建 PV,Ceph 集群我们使用 kubernetes 集群外部的已有的集群,我们没有必要重新部署了。 在 1.4 以后,kubernetes 提供了一种更加方便

  • 我们复用kubernetes的三台主机做glusterfs存储。 以下步骤参考自:https://www.xf80.com/2017/04/21/kubernetes-glusterfs/(该网站已无法访问) 安装glusterfs 我们直接在物理机上使用yum安装,如果你选择在kubernetes上安装,请参考:https://github.com/gluster/gluster-kuberne

  • 我开始使用Neo4j和Spring Data Neo4j的项目。我希望我的程序使用已经包含我的数据的本地数据库(而不是每次启动时加载数据),因为我有很多数据需要加载到数据库中。为了实现这个目标,我尝试设置一个用我的数据填充数据库的测试用例。但是,在我的测试完成后,数据库中的数据似乎不会持久:我使用neo4j控制台/shell查看数据库,发现它是空的。 我已经构建了一个小的例子项目,也不工作。任何对