我试图使用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的检索和保存,例如:
那么我对sping-data-neo4j的能力的看法是不是错了?
这似乎是一种可行的方法吗?
有没有办法向spring-data-neo4j添加一个过滤器?不知怎么的,我在上面找不到任何东西。或者,在spring数据甚至spring级别上是否有可能进行过滤,这可能会有所帮助?
我并不是一个真正的spring专家,所以任何提示都可能有帮助。
我不知何故解决了这个问题。
我使用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查看数据库,发现它是空的。 我已经构建了一个小的例子项目,也不工作。任何对