Java 从JPA到NOSQL

Java 从JPA到NOSQL,java,nosql,Java,Nosql,我正在尝试将NOSQL数据添加到基于JPA的应用程序中,如下所示。 我要添加的实体是在没有NOSQL的情况下按以下方式建模的: Triple.java @Entity @IdClass(ConceptPk.class) @Table(name = "triple") public class TripleDBModel { protected List<Annotation> annotations; public Concept conceptUriSubject;


我正在尝试将NOSQL数据添加到基于JPA的应用程序中,如下所示。
我要添加的实体是在没有NOSQL的情况下按以下方式建模的:

Triple.java

@Entity
@IdClass(ConceptPk.class)
@Table(name = "triple")
public class TripleDBModel {
    protected List<Annotation> annotations;
    public Concept conceptUriSubject;
    public Concept conceptUriObject;
    public Concept conceptUriPredicate;

    @ManyToMany(
            cascade={CascadeType.ALL }, 
            fetch=FetchType.LAZY
    )   
    @JoinTable(name = "triple_has_annotation", 
            joinColumns={@JoinColumn(name="uri_concept_subject"), @JoinColumn(name="uri_concept_object"), @JoinColumn(name="uri_concept_predicate") },          
            inverseJoinColumns=@JoinColumn(name="annotation_id") )
    public List<Annotation> getAnnotations() {
        return annotations;
    }
    public void setAnnotations(List<Annotation> annotations) {
        this.annotations = annotations;
    }
我省略了重复,但3
概念是@Id主键的一部分。
使该实体适应NOSQL:

@Entity
@IdClass(ConceptPk.class)
@Table(name = "triple")
@NodeEntity(partial = true)
public class TripleDBModel {
//Fields referring other entities shouldn't be initialized
    protected List<Annotation> annotations;
    //public Concept conceptUriSubject;
    //public Concept conceptUriObject;
    //public Concept conceptUriPredicate;


    @RelatedTo(type = "conceptUriSubject", elementClass = Concept.class)
    Set<Concept> conceptUriSubject;
@实体
@IdClass(ConceptPk.class)
@表(name=“triple”)
@节点数(部分=真)
公共类TripleDBModel{
//引用其他实体的字段不应初始化
受保护的清单说明;
//公共概念概念主体;
//公共概念对象;
//公共概念概念;
@RelatedTo(type=“conceptUriSubject”,elementClass=Concept.class)
设置概念主体;
现在的问题实际上是两个问题:

A)
@RelatedTo(type=“conceptUriSubject”,elementClass=Concept.class)
给出了Eclipse上的错误,并建议我添加一个cast,但这并不能解决错误。我不知道我是否必须为
class.java添加注释或任何其他附加内容

B) 正如我所指定的,primery键由3个概念组成,并且需要
ConceptPK.java
。JPA建模是可以的,但我不知道如何在NOSQL中实现同样的功能好吧,您还没有说要使用哪个NOSQL引擎,这一点非常重要。大多数NOSQL数据存储不支持复合的概念主键-其中一些不允许您首先使用唯一的列

首先,请注意,我为一家NoSQL供应商工作,-我不是没有偏见的

然而,从JPA到NoSQL并不难,不管你的引擎是什么。例如,对于GigaSpaces,你可以使用JPA与数据网格进行对话,只需要很少的更改,尽管那时你仍然坚持使用JPA

要真正考虑JPA,您需要将数据视为数据,而不是组织的东西;基本上,您有一个三元组,这意味着您的NoSQL数据项由三个数据项组成(谓词、主语、宾语,就像您使用的那样)。对于大多数NoSQL引擎,出于效率考虑,您可能也需要一个id

ID是“主键”,在这之后强制执行唯一的三元组比NoSQL引擎更重要;与SQL相比,这是NoSQL“受苦”的一个方面,但也是速度和存储改进最大的地方

然后,对于某些NoSQL引擎,您将构建一个文档,由三个数据项组成,您只需在将文档写入数据库之前查询该文档

我可以给你举一个许多NoSQL引擎的例子(当然也可以给GigaSpaces),但我不知道你的目标是哪一个或为什么

您的域看起来更容易在图形数据库中建模,因为这里注释的是类似RDF的三元组

您现在在Spring数据图中是对的,它不支持复合键。我们将在将来对此进行研究,但我不能保证任何事情

在该图中,您可以建模节点是概念(URI)以及表示希望用该概念表示的内容的关系类型

(TripleDBModel) - SUBJECT -> (Concept [URI = ""])
(TripleDBModel) - PREDICATE -> (Concept [URI = ""])
(TripleDBModel) - OBJECT -> (Concept [URI = ""])
(TripleDBModel) - HAS_ANNOTATION -> (Annotation)
这可以很容易地用Spring数据图(或纯Neo4j API)建模

@NodeEntity
阶级观念{
私有URI;
}
@节点性
三级{
//将自动映射到名为“subject”的关系
私人概念主体;
//或者提供显式映射
@RelatedTo(elementClass=Concept.class,type=“PREDICATE”)
私有概念谓词;
私人概念客体;
@RelatedTo(elementClass=Annotation.class,type=“HAS\u Annotation”)
私有集注释;
}
eclipse错误很烦人,但只是一个错误的可视化,AspectJ团队正在修复这个问题

希望这对你有所帮助,如果你需要进一步的建议,尽管问


迈克尔看看昆德拉


在NoSql上使用JPA是另一个类似于JPA的解决方案,但具有NoSql特有的功能,例如可以在字符串列表中嵌入@NoSqlEmbedded,并且它嵌入到该行中,从而生成一个表,其中每一行的长度与其他行的长度不同……这是NoSql常见的模式,这就是为什么NoSql ORM需要稍微从JPA

PlayOrm还支持连接和S-SQL(可伸缩SQL)

后来,,
Dean

谢谢你的解释。我使用的是Spring数据图和neo4j,我已经读到了合成Id是不允许的。你有Id的想法并不完全是我需要的,因为我需要证明没有相等的三元组。在这种情况下,你必须启动事务,运行查询,如果查询失败,更新数据。neo4j没关系,不过我显然更喜欢我们自己的产品。:)我可以想象……:)非常感谢!
(TripleDBModel) - SUBJECT -> (Concept [URI = ""])
(TripleDBModel) - PREDICATE -> (Concept [URI = ""])
(TripleDBModel) - OBJECT -> (Concept [URI = ""])
(TripleDBModel) - HAS_ANNOTATION -> (Annotation)
@NodeEntity
class Concept {
   private URI uri;
}
@NodeEntity
class Triple {
   // will be automatically mapped to a relationship with the name "subject"
   private Concept subject;
   // or provide explicit mapping
   @RelatedTo(elementClass=Concept.class, type = "PREDICATE")
   private Concept predicate;
   private Concept object;

   @RelatedTo(elementClass=Annotation.class, type = "HAS_ANNOTATION")
   private Set<Annotation> annotations;
}