Spring EclipseLink NoSQL - 使用MongoDB和Oracle NoSQL DB构建
我们已经探索了如何实现EclipseLink JPA和众所周知的关系数据库(如MySQL)之间的集成。EclipseLink不仅提供与关系数据库平台的集成,还支持MongoDB和Oracle NoSQL数据库。
下一个版本还将使您能够使用:Cassandra,Google Big Table和CouchDB作为NoSQL持久性存储。在本教程中,我们将为您提供一个完整的示例,帮助您与MongoDB和Oracle NoSQL数据库进行JPA集成。
目录[ 隐藏 ]
- 1必备工具
- 2最终项目结构
- 3员工映射
- 4 MongoDB - 持久化上下文
- 5 OracleNoSQL-持久化上下文
- 6 EclipseLink - Spring Context Integration
- 7 Primefaces部署描述符
- 8个 Primefaces - 面部配置
- 9春季员工服务
- 10 Primefaces RegisterEmployee ManagedBean
- 11 Primefaces注册视图
- 12 MongoDB演示
- 13 OracleNoSQL演示
- 14技术帮助
- 15个 Maven依赖文件
- 16总结
必备工具
- MongoDB安装并运行到您的环境中
- Oracle NoSQL数据库已安装并运行到您的环境中
- Apache Tomcat 8
- JDK 1.7
- Eclipse Kepler 4.3
- Maven 2+
- 春天4
- Mongo EclipseLink 2.6.0-M3。
- Oracle NoSQL EclipseLink 2.6.0-M3
- Mongo Driver 2.6.0-M3。
- OracleNoSQL驱动程序3.0.5
最终项目结构
员工映射
package com.journaldev.jpa.data;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.eclipse.persistence.nosql.annotations.DataFormatType;
import org.eclipse.persistence.nosql.annotations.Field;
import org.eclipse.persistence.nosql.annotations.NoSql;
@Entity
@NoSql(dataFormat=DataFormatType.MAPPED)
public class Employee {
@Id
@GeneratedValue
@Field(name="_id")
private String employeeId;
@Field
private String employeeName;
@Field
private Date employeeHireDate;
@Field
private double employeeSalary;
public String getEmployeeId() {
return employeeId;
}
public void setEmployeeId(String employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public Date getEmployeeHireDate() {
return employeeHireDate;
}
public void setEmployeeHireDate(Date employeeHireDate) {
this.employeeHireDate = employeeHireDate;
}
public double getEmployeeSalary() {
return employeeSalary;
}
public void setEmployeeSalary(double employeeSalary) {
this.employeeSalary = employeeSalary;
}
}
以下是上述代码的详细说明:
- 必须使用注释对Employee实体进行
@Entity
注释。JPA规范要求该注释。 - 员工标识符必须注明
@Id
。此属性应映射到默认的_id属性。如果您已消除此类映射,EMPLOYEEID
则会在Employee集合中添加一个新 列。_id
属性的值由MongoDB和Oracle NoSQL数据库自动生成。 - 您可以选择使用
@Field
注释来注释Employee的属性。如果它们被淘汰,eclipselink将自动进行映射。如果您没有在自己的MongoDB或Oracle NoSQL中创建Employee集合,eclipselink将在您后面进行创建过程,它将分别插入您的文档(即员工实例)。 - 您的实体必须注明
@NoSql
。此注释将确保持久化的实体不代表关系实体。DataFormat属性指定用于表示存储数据的类型。MongoDB和Oracle NoSQL使用的Key-BSON
格式类似于结构中的映射,因此使用了MAPPED
值。
MongoDB - 持久化上下文
要连接NoSQL持久性存储,persistence.xml
应定义一个文件。
persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="eclipselink.mongodb.jpa" transaction-type="RESOURCE_LOCAL">
<class>com.journaldev.jpa.data.Employee</class>
<properties>
<property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform"/>
<property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec"/>
<property name="eclipselink.nosql.property.mongo.port" value="27017"/>
<property name="eclipselink.nosql.property.mongo.host" value="localhost"/>
<property name="eclipselink.nosql.property.mongo.db" value="JournalDev"/>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
</persistence>
以下是上面列出的代码的详细说明:
- NoSQL持久性单元的配置与JPA持久性单元相同,
persistence.xml
用于定义持久性单元。 - 在
eclipselink.nosql.connection-spec
将被用于连接NoSQL的持久性存储的EISConnectionSpec类的指定名称。 - 在
eclipselink.target.database
指定的NoSQL平台类。
OracleNoSQL-持久化上下文
persistence.xml
<persistence-unit name="eclipselink.oraclenosql.jpa" transaction-type="RESOURCE_LOCAL">
<class>com.journaldev.jpa.data.Employee</class>
<properties>
<property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.nosql.OracleNoSQLPlatform"/>
<property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.nosql.OracleNoSQLConnectionSpec"/>
<property name="eclipselink.nosql.property.nosql.host" value="mohammad-amr-lt:5000"/>
<property name="eclipselink.nosql.property.nosql.store" value="kvstore"/>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
以下是上面列出的代码的详细说明:
- Oracle NoSQL数据库使您能够在引导时创建自己的存储。如果您已安装Oracle NoSQL数据库,则应执行java -Djava.net.preferIPv4Stack = true -jar lib \ kvstore.jar kvlite以启动Oracle NoSQL数据库。作为执行最后一个命令的结果,您应该注意到 条目。
Created new kvlite store with args:
-root ./kvroot -store kvstore -host mohammad-amr-lt -port 5000 -admin 5001 - 请注意使用
kvstore
持久性单元中使用的 那个。
EclipseLink - Spring Context Integration
Eclipselink可以与Spring Framework无缝集成。这种类型的集成将允许您轻松地获取所需的实体管理器,而无需您参与。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- Enable Spring Annotation Configuration -->
<context:annotation-config />
<!-- Scan for all of Spring components such as Spring Service -->
<context:component-scan base-package="com.journaldev.spring.service"></context:component-scan>
<!-- Necessary to get the entity manager injected into the factory bean -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<!-- Entity Manager Factory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="eclipselink.mongodb.jpa"></property>
</bean>
<!--
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="eclipselink.oraclenosql.jpa"></property>
</bean>
-->
<!-- Transaction Manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- Detect @Transactional -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
以下是上面列出的代码的详细说明:
- 一旦服务器启动其侦听器,Spring框架将查找其配置上下文 - 默认情况下为applicationContext.xml。应该在应用程序的部署描述符中定义Spring框架的监听器。请参阅下面的Primefaces Deployment Descriptor部分。
- MongoDB是一个事务性持久性存储,因此,它需要包括所有Transactional人员以保留您的文档。
- 这次通过传递持久性单元的名称来配置EntityManagerFactory。与Oracle和MySQL不同,为了创建它的实例,应该传递EclipseJPAVendor实例。
- 一旦要连接Oracle NoSQL数据库,就使用为Oracle NoSQL定义的给定持久性单元名称。
Primefaces部署描述符
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5" metadata-complete="true">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
</web-app>
以下是上面列出的代码的详细说明:
- 定义
ContextLoaderListener
是启动Spring框架所必需的。
Primefaces - 面部配置
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
以下是上面列出的代码的详细说明:
SpringBeanFacesELResolver
将帮助您将Spring bean注入您自己的JSF ManagedBean
春季员工服务
package com.journaldev.spring.service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.journaldev.jpa.data.Employee;
@Component
public class EmployeeService {
@PersistenceContext
private EntityManager em;
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
@Transactional
public void register(Employee emp) {
// Save employee
this.em.persist(emp);
}
}
以下是上面列出的代码的详细说明:
- 使用
@PersistenceContext
将注入EntityManager的实例。在Spring上下文中定义的EntityManagerFactory将用于创建EntityManager的实例
Primefaces RegisterEmployee ManagedBean
package com.journaldev.prime.faces.beans;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import com.journaldev.jpa.data.Employee;
import com.journaldev.spring.service.EmployeeService;
@ManagedBean
@SessionScoped
public class RegisterEmployee {
@ManagedProperty("#{employeeService}")
private EmployeeService employeeService;
private Employee employee = new Employee();
public EmployeeService getEmployeeService() {
return employeeService;
}
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public String register() {
// Calling Business Service
employeeService.register(employee);
// Add message
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("The Employee "+this.employee.getEmployeeName()+" Is Registered Successfully"));
return "";
}
}
Primefaces注册视图
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
<title>Register Employee</title>
</h:head>
<h:form>
<p:growl id="messages"></p:growl>
<p:panelGrid columns="2">
<p:outputLabel value="Enter Employee Name:"></p:outputLabel>
<p:inputText value="#{registerEmployee.employee.employeeName}"></p:inputText>
<p:outputLabel value="Enter Employee Hire Date:"></p:outputLabel>
<p:calendar value="#{registerEmployee.employee.employeeHireDate}"></p:calendar>
<p:outputLabel value="Enter Employee Salary:"></p:outputLabel>
<p:inputText value="#{registerEmployee.employee.employeeSalary}"></p:inputText>
</p:panelGrid>
<p:commandButton value="Register" action="#{registerEmployee.register}" update="messages"></p:commandButton>
</h:form>
</html>
MongoDB演示
在下面,您将看到所有屏幕截图,其中说明员工在注册时以及针对Mongo数据库的持久员工文档。
- 我们使用MongoVUE工具显示Mongo数据库集合和记录。
- 正如我们之前提到的,为所有已定义的集合自动添加_id列。要映射您的集合ID和_id默认值,应使用@Filed(name =“_ id”)注释。如果您没有映射它,将添加一个新列EMPLOYEEID。
OracleNoSQL演示
技术帮助
安装Oracle NoSQL数据库并启动到您的环境中并非易事。遵循主要步骤,您需要确保帮助您实现这一目标。
- 下载Oracle NoSQL二进制文件。
- 解压缩下载的文件。
- 执行 java -Djava.net.preferIPv4Stack = true -jar lib \ kvstore.jar kvlite以启动数据库。
- 通过在其VM参数中添加-Djava.net.preferIPv4Stack = true来 配置Apache Tomcat 8 。
Maven依赖文件
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.journaldev</groupId>
<artifactId>Primefaces-EclipseLink-Spring-Mongo-Oracle-NoSQL-Sample</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Primefaces-EclipseLink-Spring-Mongo-Oracle-NoSQL-Sample Maven Webapp</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
<repository>
<id>oss.sonatype.org</id>
<name>OSS Sonatype Staging</name>
<url>https://oss.sonatype.org/content/groups/staging</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- Faces Implementation -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.4</version>
</dependency>
<!-- Faces Library -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.4</version>
</dependency>
<!-- Primefaces Version 5 -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.0</version>
</dependency>
<!-- JSP Library -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- JSTL Library -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<!-- MySQL driver connector library -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<!-- Dependencies for Eclipse JPA Persistence API -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.0-M3</version>
</dependency>
<!-- Dependency for EclipseLink NoSQL Persistence API -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.nosql</artifactId>
<version>2.6.0-M3</version>
</dependency>
<!-- MongoDB Driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.12.3</version>
</dependency>
<!-- EclipseLink JPA for OracleNoSQL -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.oracle.nosql</artifactId>
<version>2.6.0-M3</version>
</dependency>
<!-- Oracle NoSQL Client Driver -->
<dependency>
<groupId>com.oracle.kv</groupId>
<artifactId>kvclient_3.0.5</artifactId>
<version>3.0.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
摘要
不仅关系数据库可以与JPA持久层集成。EclipseLink使您能够与两个主要流行的NoSQL供应商无缝集成。本教程使用Mongo和Oracle NoSQL数据库来持久保存员工实体的实例。通过下面的评论为我们做出贡献,并找到要下载的项目源代码。