EclipseLink JPA-RS简介

在之前的系列文章中,我介绍了如何创建一个将JPA用于持久层的JAX-RS服务。 EclipseLink包含一个名为JPA-RS的组件,该组件可用于轻松自动地将持久性单元公开为RESTful服务(支持XML和JSON消息)。 MOXy为JPA-RS提供XML和JSON绑定,并且双向映射之类的东西会自动为您映射。 在另一篇文章中,我将介绍如何使用MOXy定制本示例中显示的消息。

我将使用在以下帖子中创建的JPA模型:

  • 第1部分–数据库
  • 第2部分–将数据库映射到JPA实体
    • 注解

包装/部署

使用JPA-RS是一个简单的包装问题。 我们将创建一个WAR,其中包含JAR中的JPA模型,JPA-RS JAR和用于初始化JPA模型的简单会话bean。 对于此示例,我使用的是包含EclipseLink 2.5的GlassFish 4.0的升级版本。

  • http://dlc.sun.com.edgesuite.net/glassfish/4.0/promoted/

客户JPARS.war

  • 网络信息
  • META-INF
    • 清单文件

持久性WeaverBean

JPA-RS要求已初始化JPA实体。 我们将创建一个简单的会话bean来完成此任务。

package org.example.ejb;import javax.ejb.*;
import javax.persistence.*;@Startup
@Singleton
@LocalBean
public class PersistenceWeaverBean {@SuppressWarnings("unused")@PersistenceUnit(unitName = "CustomerService")private EntityManagerFactory emf;}

客户JPA.jar

该JAR包含我们在以下文章中定义的JPA模型:

  • 第2部分–将数据库映射到JPA实体
    • 注解

org.eclipse.persistence.jpars_2.5.0.qualifier.jar
这是来自EclipseLink安装的JPA-RS JAR:

<ECLIPSELINK_HOME>/jlib/jpa/org.eclipse.persistence.jpars_2.5.0.qualifier.jar

(服务元数据)

一旦部署了WAR,我们的服务就会启动。 我们可以执行GET来查看我们服务的元数据。

GET(应用程序/ xml或应用程序/ json)

用于获取服务元数据的URI具有以下格式:

http://{Server}/{Application}/persistence/v1.0/{PersistenceUnit}/metadata

以下是我们示例的URI:

http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/metadata

响应

以下是我们服务的元数据。 除了持久性单元名称之外,我们还看到JPA模型中每个实体的元数据链接。 接下来,我们将仔细研究Customer实体。

{"persistenceUnitName": "CustomerService","types": [{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/metadata/entity/Address","method": "application/json","rel": "Address"}},{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/metadata/entity/PhoneNumber","method": "application/json","rel": "PhoneNumber"}},{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/metadata/entity/Customer","method": "application/json","rel": "Customer"}}]
}

(实体元数据)

如果我们点击其中一个实体的链接,那么我们将获得以下信息:

  • 实体属性。
  • 我们可以在实体上执行的CRUD操作。
  • 我们可以在实体上执行的命名查询。

GET(应用程序/ xml或应用程序/ json)

用于获取实体元数据的URI具有以下格式:

http://{Server}/{Application}/persistence/v1.0/{PersistenceUnit/metadata/entity/{Entity}

以下是获取Customer实体的元数据的URI:

http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/metadata/entity/Customer

响应

以下是客户实体的元数据。 我们将仔细研究POST操作(第37-39行)和命名查询(第49-58行)。

{"name": "Customer","attributes": [{"name": "id","type": "long"},{"name": "firstName","type": "String"},{"name": "lastName","type": "String"},{"name": "address","type": "Address"},{"name": "phoneNumbers","type": "Set<PhoneNumber>"}],"linkTemplates": [{"method": "get","href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer/{primaryKey}","rel": "find"},{"method": "put","href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer","rel": "persist"},{"method": "post","href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer","rel": "update"},{"method": "delete","href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer/{primaryKey}","rel": "delete"}],"queries": [{"queryName": "findCustomersByCity","returnTypes": ["Customer"],"linkTemplate": {"method": "get","href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/query/findCustomersByCity;city={city}","rel": "execute"},"jpql": "SELECT c FROM Customer c WHERE c.address.city = :city"}]
}

实体存在

我们将使用POST操作创建Customer实体的新实例。

POST(应用程序/ xml或应用程序/ json)

用于创建实体的URI具有以下格式:

http://{Server}/{Application}/persistence/v1.0/{PersistenceUnit}/entity/{Entity}

以下是用于创建Customer实例的URI:

http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer

请求

以下是我们将发布到上述URI中的客户数据的JSON表示形式:

{"id" : 1,"firstName" : "Jane","lastName" : "Doe","address" : {"id" : 1,"street" : "1 A Street","city" : "Any Town"},"phoneNumbers" : [{"id" : 2,"type" : "work","num" : "555-1111"}, {"id" : 3,"type" : "home","num" : "555-2222"}]
}

执行查询

JPA-RS会为我们在JPA模型中定义的每个命名查询自动创建URI:

GET(应用程序/ xml或应用程序/ json)

执行命名查询的URI具有以下格式:

http://{Server}/{Application}/persistence/v1.0/{PersistenceUnit}/query/{NamedQuery;Parameters}

下面,我们将调用名为findCustomersByCity的查询,以查找来自Any Town的所有客户。

http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/query/findCustomersByCity;city=Any%20Town

响应

以下是调用命名查询的结果。 我们可以看到实体之间的关系表示为链接。 您在链接上执行GET以获取引用的数据。

[{"firstName": "Jane","id": 1,"lastName": "Doe","_relationships": [{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer/1/address","rel": "address"}},{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Customer/1/phoneNumbers","rel": "phoneNumbers"}}],"address": {"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/Address/1","method": "GET","rel": "self"}},"phoneNumbers": [{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/PhoneNumber/3","method": "GET","rel": "self"}},{"_link": {"href": "http://localhost:8080/CustomerJPARS/persistence/v1.0/CustomerService/entity/PhoneNumber/2","method": "GET","rel": "self"}}]}
]

参考:在Java XML和JSON绑定博客上,我们的JCG合作伙伴 Blaise Doughan 介绍了EclipseLink JPA-RS 。

翻译自: https://www.javacodegeeks.com/2013/04/introducing-eclipselink-jpa-rs.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何对java分装,Angular4 JSONP + JAVA代码

一、在app.module.ts模块中&#xff0c;注入JsonpModule模块import {JsonpModule} from "angular/http";NgModule({imports: [JsonpModule //注入JSonpModule模块]})二、创建服务httpService&#xff0c;并注入jsonp和map(分装好的服务 可以直接调用)import {Injecta…

教你开发jQuery插件(转)

教你开发jQuery插件&#xff08;转&#xff09; 阅读目录 基本方法支持链式调用让插件接收参数面向对象的插件开发关于命名空间关于变量定义及命名压缩的好处工具GitHub Service Hook原文&#xff1a;http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最…

gulp 常用插件汇总

2017-07-26更新&#xff1a;图片压缩插件使用gulp-smushit&#xff0c;gulp-smushit压缩率比较大&#xff0c;gulp-imagemin 图片压缩插件压缩率不明显。 见下图压缩率&#xff1a; 1、gulp安装 参照gulp官网进行安装&#xff1a;http://www.gulpjs.com.cn/docs/getting-start…

Nmap介绍

1.Nmap介绍 Nmap用于列举网络主机清单、管理服务升级调度、监控主机或服务运行状况。Nmap可以检测目标机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 1.1 Zenmap Zenmap是Nmap官方提供的图形界面&#xff0c;通常随Nmap的安装包发布…

使用Maven安装本地jar

1.问题与选择 Maven是一种非常通用的工具&#xff0c;其可用的公共存储库首屈一指。 但是&#xff0c;总会有一个不在任何地方托管的工件&#xff0c;或者托管该工件的存储库有依赖的风险&#xff0c;因为当您需要它时&#xff0c;它可能不会启动。 发生这种情况时&#xff0c;…

转:.NET面试题汇总(三)

原文地址&#xff1a;http://www.cnblogs.com/yuan-jun/p/6600692.html 1、简述 private、 protected、 public、 internal 修饰符的访问权限。private : 私有成员, 在类的内部才可以访问。protected : 保护成员&#xff0c;该类内部和继承类中可以访问。public : 公共成员&…

matlab 多文件编程,是否有可能在MATLAB中为每个文件定义多个函数,并从该文件外部访问它们?...

m文件(即主函数 )中的第一个函数在调用m文件时被调用。 主函数不需要与m文件具有相同的名称&#xff0c;但为了清晰起见&#xff0c;它应该是这样 。 当function和文件名称不同时&#xff0c;必须使用文件名称来调用主函数。m文件中的所有后续函数(称为本地函数 (或旧术语中的“…

简单的Gradle Web应用程序

Gradle通过“ war”和“ jetty”插件轻松支持Java Web应用程序。 本教程将向您展示如何快速创建一个简单的Java Servlet Web应用程序。 我们的基本项目结构将是&#xff1a; basic-websrcmainjavacomcodetutrHelloWorldServlet.javawebappWEB-INFweb.xml首先&#xff0c;创建一…

SD/MMC相关寄存器的介绍

1.SD卡内部架构 在熟悉SD/MMC相关寄存器之前&#xff0c;我们先来看看SD卡的内部架构是怎么样的&#xff0c;如下图所示&#xff1a; 2.SD/MMC相关寄存器的介绍 从上图中总结出&#xff1a;SD卡内部有7个寄存器. 一、OCR,CID,CSD和SCR寄存器保存卡的配置信息; 二、RCA寄存器保存…

【模板】OI常用模板(待补充)

//PS&#xff1a;最近修改日期&#xff1a;2017-11-07  20:41:44 首先感觉这种模板类的东西写了还是很有意义的&#xff0c;毕竟时不时的可以拿出来借鉴一下。 现在因为刚开始写这一类的东西&#xff0c;所以说还不是很详细&#xff0c;若有读者感觉可以补充&#xff0c;欢迎…

form中action属性后面?传递参数 获取不到

1 $p_id $_REQUEST[p_id]; 2 3 echo "<h1>您将更新商品编号为<span>$p_id</span>的商品信息 <a hreflistproduct.php>查看所有</a></h1> 4 <form actionupdateproduct.do.php?p_id$p_id methodget> 5 商品名称&#xff…

apche 禁止运行php,学习猿地-apache如何禁止执行php

apache禁止执行php的方法&#xff1a;首先新建一个“.htaccess”文件&#xff1b;然后复制代码内容“Order allow,deny”到“.htaccess”文件中&#xff1b;最后将该文件直接放到网站根目录里即可。apache禁止执行php的方法&#xff1a;第一种禁止上传目录运行php的方法如果你用…

Apache Camel 2.11发布

上周Apache Camel 2.11发布了。 这篇博客文章总结了最引人注目的新功能和改进。 有关详细说明&#xff0c;请参见Camel 2.11发行说明 。 1&#xff09;新组件 与往常一样&#xff0c;每个新发行版都包含许多新组件&#xff0c;这些组件由我们庞大的用户群贡献。 谢谢你们。 例…

linux分区满了,如何进行扩容

转自&#xff1a;https://blog.csdn.net/valage/article/details/73332147 图片中可以看到挂载点“/”的利用率移到100%&#xff0c;空间不够&#xff0c;所以要对其进行分区。 1. 先进入虚拟机设置里增大磁盘空间 注意&#xff1a;将25改成50&#xff0c;以扩大空间。这里…

RDA DEBUG

DEBUG寄存器&#xff1a;word 0xa0000010 word 0xa0000010 1  //debug开 word 0xa0000010 0  //debug关 当然也可以按模块打开/关闭debug信息&#xff0c;如 DBGCFG_KMF/DBGCFG_UMF/DBGCFG_MENU/DBGCFG_TUNER模块等。 所以大家在使用过程中要按源文件所在的模块加打印信息&…

DIV CSS布局-固定页面开度布局

DIV CSS布局中主要CSS属性介绍&#xff1a; Float: Float属性是DIV CSS布局中最基本也是最常用的属性&#xff0c;用于实现多列功能&#xff0c;我们知道<div>标签默认一行只能显示一个&#xff0c;而使用Float属性可以实现一行显示多个div的功能&#xff0c;最直接解释…

php获取网页js中的json,从php获取json数据使用js读取显示到网页笔记

//json与数组转换$array array("username" > "hellojson","age" > 23,"sex">"M");//定义php数组$resjson_encode($array);//var_dump($res);echo $res;//将结果输出到页面?>HTML代码$(function(){$(document)…

BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

题目链接 类似求树的直径&#xff0c;可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链、次长链&#xff0c;用每个点子节点不同子树的 max{最长链}max{次长链} 更新答案。(不需要存次长链&#xff0c;求解过程中先更新ans&#xff0c;然后再更新最长链即可) 设…

Spring Java配置

我发现许多我认识的Spring开发人员仍然不了解或使用Spring Java Configuration&#xff08;aka JavaConfig&#xff09;。 Spring 3.0引入了此功能&#xff0c;该功能使Spring可以完全用Java进行配置-不再需要XML&#xff01; 我真的很喜欢使用JavaConfig&#xff0c;因为&…

纯 CSS 实现波浪效果!

一直以来&#xff0c;使用纯 CSS 实现波浪效果都是十分困难的。 因为实现波浪的曲线需要借助贝塞尔曲线。 而使用纯 CSS 的方式&#xff0c;实现贝塞尔曲线&#xff0c;额&#xff0c;暂时是没有很好的方法。 当然&#xff0c;借助其他力量&#xff08;SVG、CANVAS&#xff09…