跳到主要内容

注意:此Wiki现在是只读的,无法再进行编辑。请参阅:https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan用于计划。

跳转到:航行,搜索

EclipseLink/Examples/JPA/NoSQL

无SQL

NoSQL是不符合关系数据库或SQL标准的数据库系统的分类。它们有各种各样的根源,从分布式互联网数据库到对象数据库、XML数据库,甚至是遗留数据库。由于它们在谷歌、亚马逊和脸书的大规模分布式数据库中的使用,它们最近变得很流行。

有各种NoSQL数据库,包括:

  • 蒙哥DB
  • Oracle NoSQL
  • 卡桑德拉
  • 谷歌BigTable
  • 沙发DB

从EclipseLink 2.4开始,EclipseLink增加了对NoSQL数据库的JPA支持,最初支持MongoDB和Oracle NoSQL。

EclipseLink的NoSQL支持允许将JPA API和JPA注释/xml与NoSQL数据一起使用。EclipseLink还支持几个特定于NoSQL的注释/xml,包括@NoSQL,它定义了一个类来映射NoSQL数据。

EclipseLink的NoSQL支持基于自EclipseLink 1.0以来提供的EIS支持。EclipseLink的EIS支持允许将对象持久化到遗留和非关系数据库。EclipseLink的EIS和NoSQL支持使用Java连接器体系结构(JCA)访问数据源,类似于EclipseLink关系支持使用JDBC的方式。通过创建EclipseLink EISPlatform类和JCA适配器,EclipseLink的NoSQL支持可扩展到其他NoSQL数据库。

订购示例

此示例显示如何将Ordering系统对象模型映射到Oracle NoSQL数据库(ONDB)和MongoDB NoSQL数据库并将其持久化。

ONDB示例的源代码可以找到在这里.

可以找到MongoDB示例的源代码在这里,或来自EclipseLink SVN储存库.

订购对象模型

订购系统由四个类组成:Order、OrderLine、Address和Customer。订单有一个帐单和发货地址、多个订单行和一个客户。

公众的 订单实施 可序列化 {
    私有的 字符串身份证件;
    私有的 字符串描述;
    私有的 双重的总成本= 0;
    私有的地址账单地址;
    私有的地址发货地址;
    私有的列表<订单行>订单行= 新的数组列表<订单行>();
    私有的客户-客户;...}
公众的 订单行实施 可序列化 {
    私有的 整数行号;
    私有的 字符串描述;
    私有的 双重的成本= 0;...}
公众的 地址实施 可序列化 {
    私有的 字符串街道;
    私有的 字符串城市;
    私有的 字符串省份;
    私有的 字符串国家;
    私有的 字符串邮政编码;....}
公众的 客户实施 可序列化 {
    私有的 字符串身份证件;
    私有的 字符串名称;...}

步骤1:决定如何存储数据

ONDB将数据存储为键值对,其中值可以是JSON或ByteArray,MongoDB将数据保存为BSON(二进制JSON)文档。必须做出的第一个决定是如何存储对象。通常,每个独立的对象都会组成一个值或文档,因此单个值/文档可以包含Order、OrderLine和Address。由于客户可以在多个订单之间共享,因此客户将是其自身的价值/文档。

步骤2:映射数据

下一步是映射对象。值/文档中的每个根对象都将映射为JPA中的@Entity。通过嵌入父对象的值/文档来存储的对象映射为@Embeddable。这与JPA映射关系数据的方式类似,但在NoSQL中,由于数据格式的层次性,嵌入式数据更为常见。总之,订单和客户映射为@Entity,订单行和地址映射为@Embeddable。

@NoSQL注释用于映射NoSQL数据。这将类标记为映射到NoSQL数据,而不是传统的关系数据。它在每个持久性类(实体和可嵌入类)中都是必需的。@NoSQL注释允许设置dataType和dataFormat。

dataType相当于关系数据中的表,其含义可能因所使用的NoSQL数据源而异。对于ONDB,数据类型被忽略。在MongoDB中,dataType是指用于存储数据的集合。dataType默认为实体名(大写),即简单类名。

数据格式取决于存储的数据类型。EclipseLink、XML、Mapped和Indexed支持三种格式。XML是默认的,但由于ONDB key-value和MongoDB使用key-BSON,这在结构上类似于Map,所以使用Mapped。总之,每个类都需要@NoSql(dataFormat=DataFormatType.MAPPED)注释。

@实体@无Sql(数据格式=数据格式类型。映射的)
公众的 订单
@可嵌入@无Sql(数据格式=数据格式类型。地图)
公众的 订单行

步骤3:定义Id

JPA要求每个实体定义一个Id。Id可以是自然Id(应用程序分配Id)或生成的Id(Id由EclipseLink分配)。ONDB直接使用Entity类中的id字段。MongoDB要求每个文档中都有_id字段。如果不存在_id字段,Mongo将使用OID(对象标识符)自动生成并分配_id字段。OID类似于UUID(通用唯一标识符)。

您可以在NoSQL的EclipseLink中自由使用任何字段或字段集作为Id,与关系实体相同。要使用应用程序分配的id作为Mongo id,只需将其字段命名为“_id”。这可以通过@Field注释来完成,它类似于@Column注释(也可以),但没有所有的关系细节,它只有一个名称。因此,要定义Mongo将用于映射中的id include@field(name=“_id”)的字段。

要使用EclipseLink生成的id作为JPA id,只需在对象的id字段映射中包含@id、@GeneratedValue。要使用生成的Mongo OID作为JPA Id,只需在对象的Id字段映射中包含@Id、@GeneratedValue和@Field(name=“_Id”)。@GeneratedValue告诉EclipseLink使用Mongo OID生成这个id值@ONDB和MongoDB中不支持SequenceGenerator和@TableGenerator,因此无法使用它们。此外,不支持IDENTITY、TABLE和SEQUENCE的生成类型。如果希望使用UUID而不是Mongo OID,则可以使用EclipseLink@UUIDGenerator(ONDB的默认值为@GeneratedValue)。您还可以使用自己的自定义生成器。Mongo OID或UUID的id值不是数值,只能映射为String或byte[]。

ONDB公司:

@身份证@生成的值私有的 字符串身份证件;

MongoDB:

@身份证@生成的值@字段(名称=“_id”)
私有的 字符串身份证件;

步骤4:定义映射

对象中的每个属性也已映射。如果没有为属性定义注释/xml,那么它的映射将是默认的。NoSQL数据的默认规则遵循JPA默认规则,因此如果使用默认值,大多数简单映射都不需要任何配置。ONDB值和Mongo BSON文档中使用的字段名将镜像对象属性名称(大写)。要提供不同的字段名,请使用@field注释。

存储在值/文档中的任何嵌入值都使用@embedded JPA注释进行持久化。嵌入式集合将使用JPA@ElementCollection注释。NoSQL中不使用或不支持@ElementCollection的@CollectionTable,因为数据存储在值/文档中,所以不需要单独的表。NoSQL也不需要也不支持@AttributeOverride,因为嵌入的对象嵌套在值/文档中,不需要唯一的字段名。通常不需要@Embedded注释/xml,因为它是默认值,所以需要@ElementCollection,因为默认值目前不适用于EclipseLink中的@ElementCollection。

关系注释/xml@OneToOne、@ManyToOne、@OneToMany和@ManyToMany仅用于NoSQL中的外部关系。值/文档中的关系使用嵌入式注释/xml。其他值/文档支持外部关系。要定义外部关系,需要使用外键。目标对象的id存储在源对象的文档中。如果是集合,则存储id的集合。要定义值/文档中外键字段的名称,请使用@JoinField注释/xml。

NoSQL数据不支持关系上的mappedBy选项,对于双向关系,外键需要存储在两边。也可以使用查询定义关系映射,但目前不支持通过注释/xml,只支持通过DescriptorCustomizer。

ONDB和MongoDB:

@基本私有的 字符串描述;@基本私有的 双重的总成本= 0;@嵌入式私有的地址账单地址;@嵌入式私有的地址发货地址;@元素集合私有的列表<订单行>订单行= 新的数组列表<订单行>();@多对一(取来=获取类型。LAZY公司)
私有的客户-客户;

第5步:乐观锁定

ONDB和MongoDB支持乐观锁定。这不是必需的,但如果需要锁定,则可以使用@Version注释。

MongoDB不支持事务,所以如果在事务期间发生锁定错误,则之前写入的任何对象都不会回滚。

ONDB和MongoDB:

@版本私有的 长的版本;

第六步:查询

ONDB目前不支持二级索引,因此其JPQL功能仅限于基本id和基于范围的查找。

MongoDB拥有自己的基于JSON的示例语言查询。它不支持SQL(即NoSQL),因此查询具有局限性。

EclipseLink支持MongoDB上的JPQL和Criteria API。与ONDB一样,并不支持JPQL的所有方面。支持大多数基本操作,但不支持联接,也不支持子选择、分组或某些数据库函数。支持查询嵌入值和元素集合,以及排序和选择属性值。

并非所有的NoSQL数据库都支持查询,因此EclipseLink的NoSQL支持仅在NoSQL平台支持时才支持查询。

查询查询=相对长度单位。创建查询(“从订单o中选择o,其中o.totalCost>1000”);列表<订单>订单=查询。获取结果列表(); 查询查询=相对长度单位。创建查询(“从订单o中选择o,其中o.description类似于“弹球%””);列表<订单>订单=查询。获取结果列表(); 查询查询=相对长度单位。创建查询(“从订单中选择o加入o.orderLines l,其中l.description=:desc”);查询。setParameter(设置参数)(“描述”,“发货”);列表<订单>订单=查询。获取结果列表();

EclipseLink NoSQL中的MongoDB也支持本机查询。对于MongoDB,本机查询使用MongoDB的命令语言。

查询查询=相对长度单位。创建本机查询(“”db.ORDER.findOne“({\"_标识\":\"" +oid类+ "\"})",订单。);订单= (订单)查询。获取单一结果();

第7步:连接

与数据库的连接是通过JPA persistence.xml属性完成的。必须在相应NoSQL存储的持久性单元中设置以下属性:平台:“eclipselink.target-database”,连接规范:“ecliepselink.NoSQL.Connection-Spec”。还应设置其他NoSQL存储特定属性,如DatabaseName、Host和Port。注意,对于MongoDB,主机和端口可以接受以逗号分隔的值列表来连接到Mongo数据库集群。对于ONDB,分布式数据库中的所有节点都会自动连接,因此不需要特殊的连接列表。

ONDB公司:

<持久性-单位 名称=“ondb” 交易类型=“资源_本地”>
     <类别>模型。订单</类>
     <类别>模型。订单行</类>
     <类别>模型。地址</类>
     <类别>模型。客户</类>
     <属性>
         <属性 名称=“eclipselink.target数据库” 价值=“org.eclipse.persistence.nosql.adapters.nosql.OracleNoSQLPlatform”/>
         <属性 名称=“eclipselink.nosql.connection-spec” 价值=“org.eclipse.persistence.nosql.adapters.nosql.OracleNoSQLConnectionSpec”/>
         <属性 名称=“eclipselink.nosql.property.nosql.host” 价值=“本地主机:5000”/>
         <属性 名称=“eclipselink.nosql.property.nosql.store” 价值=“kvstore”/>
         <属性 名称=“eclipselink.logging.level” 价值=“最佳”/>
     </属性>
</持久性-单位>

MongoDB:

<持久性-单位 名称=“蒙古示例” 交易类型=“资源_本地”>
        <类别>模型。订单</类>
        <类别>模型。订单行</类>
        <类别>模型。地址</类>
        <类别>模型。客户</类>
        <属性>
            <属性 名称=“eclipselink.target-database” 价值=“org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform”/>
            <属性 名称=“eclipselink.nosql.connection-spec” 价值=“org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec”/>
            <属性 名称=“eclipselink.nosql.property.mongo.port” 价值="27017"/>
            <属性 名称=“eclipselink.nosql.property.mongo.host” 价值=“本地主机”/>
            <属性 名称=“eclipselink.nosql.property.mongo.db” 价值=“我的数据库”/>
            <属性 名称=“eclipselink.logging.level” 价值=“最佳”/>
        </属性>
</持久性-单位>

总结

此演示的完整源代码可从以下网站获得:

ONDB公司:[1].

MongoDB:SVN公司.

要运行此示例,您需要一个数据库,该数据库可以从以下位置下载:

ONDB公司:[2].

MongoDB:http://www.mongodb.org/下载.

EclipseLink还支持NoSQL访问其他数据源,包括:

  • XML文件
  • JMS公司
  • Oracle AQ公司

另请参见

有关更多信息,请参阅EclipseLink解决方案指南.

这个Polyglot持久性该示例演示了如何在单个应用程序中混合映射到NoSQL和关系数据库的对象。

返回顶部