Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/UserGuide/JPA/Advanced JPA Development/NoSQL/Mappings"
(→Basic) |
(→Basic) |
||
Line 26: | Line 26: | ||
===Basic=== | ===Basic=== | ||
− | Basic mappings for NoSQL support all of the same options a regular JPA Basic mappings. Temporal types, converters, lobs, and enumerated options are supported. The <code>@Field</code> annotation or <code> | + | Basic mappings for NoSQL support all of the same options a regular JPA Basic mappings. Temporal types, converters, lobs, and enumerated options are supported. The <code>@Field</code> annotation or <code>field</code> should be used to define the field name. The field name will be the name of the field used in the object's data structure. |
:XML - field name can use XPath expressions. These include using <code>'@'</code> for attributes, <code>'/'</code> for nested elements, <code>'[1]'</code> for positional elements, and <code>'text()'</code> for element text. | :XML - field name can use XPath expressions. These include using <code>'@'</code> for attributes, <code>'/'</code> for nested elements, <code>'[1]'</code> for positional elements, and <code>'text()'</code> for element text. |
Revision as of 14:55, 1 May 2012
EclipseLink JPA
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Key API
Native API
Contents
Mapping
NoSQL maps objects to structured data such as XML or JSON. NoSQL support embedded data and embedded collections.
NoSQL supports all of the existing JPA mapping annotations and XML. @Column
and @JoinColumn
should not be used, instead @Field
and @JoinField
should be used. @JoinTable
and @CollectionTable
are not supported, or required.
Id
Any entity object must define an Id. The Id is used by EclipseLink for caching, object identity and to unique identify an object in the data-store. NoSQL databases may have a concept of an Id, or may not. The @GeneratedValue
option is supported with NoSQL. It maps to whatever id generating the NoSQL database provides, and if none is provided it makes use of a UUID. A UUID generated id must be declared as either a String
or byte[]
.
MongoDB Ids
MongoDB requires every document have an _id
field. If the document does not have the field, then one will be generated by the database using an OID, which is similar to a UUID. An OID must be declared as either a String
or byte[]
. The application can define its own value for the _id
, or can use a generated value. The entity Id is not required to match the MongoDB _id
, and composite IDs are supported, but this is recommended to use _id
as the Id field name.
Oracle NoSQL Ids
Oracle NoSQL has a concept of major keys and minor keys. By default EclipseLink will create the major key as a composite key of the entity name and each of the entities Id values. Generated id values are supported using UUID.
Basic
Basic mappings for NoSQL support all of the same options a regular JPA Basic mappings. Temporal types, converters, lobs, and enumerated options are supported. The @Field
annotation or field
should be used to define the field name. The field name will be the name of the field used in the object's data structure.
- XML - field name can use XPath expressions. These include using
'@'
for attributes,'/'
for nested elements,'[1]'
for positional elements, and'text()'
for element text.
- Oracle NoSQL - field names map to the minor keys in the key/value store.
NoSQL Examples
The following provides mappings for an Order model. The first example uses MAPPED
data, such as mapping to a MongoDB JSON document. The second example uses XML
data, such as mapping to XML files.
NoSQL MAPPED example
@Entity @NoSQL(dataFormat=DataFormatType.MAPPED, dataType="orders") public class Order { @Id @GeneratedValue @Field(name="_id") private long id; @Basic @Field(name="description") private String description; @Embedded @Field(name="deliveryAddress") private Address deliveryAddress @ElementCollection @Field(name="orderLines") private List<OrderLine> orderLines; @ManyToOne @JoinField(name="customerId") private Customer customer; }
This would produce the following mapped data. The mapped format could map to many different structures, this example shows it as a JSON document.
{ "_id": "4F99702B271B1948027FAF06", "description": "widget order", "deliveryAddress": { "street": "1712 Hasting Street", "city": "Ottawa", "province": "ON", "postalCode": "L5J1H5", }, "orderLines": [ {"lineNumber": "1", "itemName": "widget A", "quantity": "5"}, {"lineNumber": "2", "itemName": "widget B", "quantity": "1"}, {"lineNumber": "3", "itemName": "widget C", "quantity": "2"} ], "customerId": "4F99702B271B1948027FAF08", }
NoSQL XML example
@Entity @NoSQL(dataType="order") public class Order { @Id @GeneratedValue @Field(name="@id") private long id; @Basic @Field(name="@description") private String description; @Embedded @Field(name="delivery-address") private Address deliveryAddress @ElementCollection @Field(name="orderLines/order-line") private List<OrderLine> orderLines; @ManyToOne @JoinField(name="customer-id") private Customer customer; } @Embeddable @NoSQL(dataFormat=DataFormatType.MAPPED) public class OrderLine { @Field(name="@line-number") private int lineNumber; @Field(name="@item-name") private String itemName; @Field(name="@quantity") private int quantity; }
This would produce the following XML data.
<order id="4F99702B271B1948027FAF06" description="widget order"> <deliveryAddress street="1712 Hasting Street" city="Ottawa" province="ON" postalCode="L5J1H5"/> <order-lines> <order-line lineNumber="1" itemName="widget A" quantity="5"/> <order-line lineNumber="2" itemName="widget B" quantity="1"/> <order-line lineNumber="3" itemName="widget C" quantity="2"/> <order-lines> <customer-id>4F99702B271B1948027FAF08</customer-id> <order>