Spring EclipseLink NoSQL - 使用MongoDB和Oracle NoSQL DB构建

 

Spring EclipseLink NoSQL - 使用MongoDB和Oracle NoSQL DB构建

 

我们已经探索了如何实现EclipseLink JPA和众所周知的关系数据库(如MySQL)之间的集成。EclipseLink不仅提供与关系数据库平台的集成,还支持MongoDB和Oracle NoSQL数据库。

下一个版本还将使您能够使用:CassandraGoogle Big TableCouchDB作为NoSQL持久性存储。在本教程中,我们将为您提供一个完整的示例,帮助您与MongoDB和Oracle NoSQL数据库进行JPA集成。

目录[ 隐藏 ]

必备工具

最终项目结构

Primefaces  -  Eclipselink  -  JPA  - 最终项目结构

员工映射


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数据库的持久员工文档。

Primefaces员工已注册MongoDB

MongoDB  - 持久员工

  • 我们使用MongoVUE工具显示Mongo数据库集合和记录。
  • 正如我们之前提到的,为所有已定义的集合自动添加_id列。要映射您的集合ID和_id默认值,应使用@Filed(name =“_ id”)注释。如果您没有映射它,将添加一个新列EMPLOYEEID。

OracleNoSQL演示

Primefaces员工注册OracleNoSQL

OracleNoSQL  - 持久员工

技术帮助

安装Oracle NoSQL数据库并启动到您的环境中并非易事。遵循主要步骤,您需要确保帮助您实现这一目标。

  • 下载Oracle NoSQL二进制文件。
  • 解压缩下载的文件。
  • 执行  java -Djava.net.preferIPv4Stack = true -jar lib \ kvstore.jar kvlite以启动数据库。
  • 通过在其VM参数中添加-Djava.net.preferIPv4Stack = true来 配置Apache Tomcat 8  。

Oracle NoSQL  - 终端命令

Apache Tomcat 8  - 调试 -  VM参数

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数据库来持久保存员工实体的实例。通过下面的评论为我们做出贡献,并找到要下载的项目源代码。

下载Primefaces Spring EclipseLink NoSQL项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值