jpa动态扩展sql_扩展您的JPA POJO

jpa动态扩展sql

可扩展性是许多体系结构的重要特征。 它衡量是否容易(或困难)
它是在不影响现有核心系统功能的情况下添加或更改功能。

让我们举一个简单的例子。 假设您的公司拥有一个核心产品来跟踪体育俱乐部中的所有用户。 在您的产品体系结构中,您有一个由JPA POJO表示的域模型。 域模型包含许多POJO,当然包括用户POJO。

package com.alex.staveley.persistence
/*** User entity.  Represents Users in the Sports Club. * * Note: The SQL to generate a table for this in MySQL is:** CREATE TABLE USER (ID INT NOT NULL auto_increment, NAME varchar(255) NOT NULL, *  PRIMARY KEY (ID)) ENGINE=InnoDB;*/ 
@Entity
public class User {/* Surrogate Key - automatically generated by DB. */ @GeneratedValue(strategy=GenerationType.IDENTITY) @Idprivate int id;private String name;public int getId() {return id;}public void setName(String name) {this.name=name;}public String getName() {return name;}
}

现在,一些客户喜欢您的产品,但是他们需要在购买之前进行一些自定义。 例如,
一位客户希望将属性出生地添加到用户,并希望此属性持续存在。 当然,此属性的逻辑位置是在用户POJO中,但是没有其他客户想要此属性。 所以你会怎么做?

您是否仅为此客户创建了特定的User类,然后才为他们交换了该类? 怎么了
当您更改产品用户类别时呢? 如果另一个客户想要另一个定制怎么办?
还是改变主意? 您是否感觉事情会变得混乱?

幸运的是,JPA的一种实现:Eclipselink在这里提供了帮助。 2.3版本 (自2011年6月开始提供,最新版本是2011年12月9日最近发布的2.3.2维护)包括一些非常好的功能,可以解决这种情况。 让我们详细说明。 通过将@VirtualAccessmethods Eclipselink注释简单地添加到POJO,我们向Eclipselink发出信号,表明POJO可能具有一些额外的( 也称为虚拟 )属性。 您不必在代码中指定任何这些额外的属性, 否则它们将不是非常虚拟的 ! 您只需要指定一个通用的getter和setter来满足他们的获取和设置。 您还必须在某个地方将它们存储在内存中,就像一个很好的旧哈希图–当然,这应该是暂时的,因为我们不保留哈希图本身。 注意:它们不必存储在HashMap中,这只是一个流行的选择!

让我们看一下我们现在可以扩展的用户。

@Entity
@VirtualAccessMethods
public class User {/* Surrogate Key - automatically generated by DB. */@GeneratedValue(strategy=GenerationType.IDENTITY) @Idprivate int id;private String name;@Transientprivate Map<String, Object> extensions = new HashMap();public int getId() {return id;}public void setName(String name) {this.name=name;}public String getName() {return name;}public <t> T get(String name) {return (T) extensions.get(name);}public Object set(String name, Object value) {return extensions.put(name, value);} 
}

那是吗? 好吧,还有更多的魔术。 您必须告诉eclipselink您的其他属性。 更具体地说:它们的名称和数据类型是什么。
您可以通过更新eclipselink-orm.xml来做到这一点,该文件位于persistent.xml所在的同一META-INF文件夹中。

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_1.xsd"version="2.1"><entity class="com.alex.staveley.persistence.User"><attributes><basic name="thebirthplace" attribute-type="String" access="VIRTUAL"><column name="birthplace"/><access-methods get-method="get" set-method="set"/></basic></attributes></entity> 
</entity-mappings>

现在,此配置简单说明,User实体具有一个附加属性,在Java中为“ thebirthplace”,并且是虚拟的。 这意味着它不是在POJO中明确定义的,但是如果我们要调试东西,我们会在内存中看到该属性的名称为“出生地”。

此配置还指出该属性的相应数据库列是出生地。
eclipselink可以使用通用的get / set方法来获取和设置此方法。

你想测试吗?

将该列添加到数据库表中。 在MySql中,这将是:

alter table用户添加列的出生地varchar(64)

然后运行以下简单测试:

@Test
public void testCreateUser() {User user = new User();user.setName("User1Name");user.set("thebirthplace", "donabate");entitymanager.getTransaction().begin();entitymanager.persist(user);entitymanager.getTransaction().commit();entitymanager.close();
}

因此,现在,我们可以在产品代码中拥有一个可扩展的用户POJO。 每个客户都可以根据需要将自己的属性添加到用户。 当然,每个客户都与
通过确保每个客户的扩展都驻留在特定的eclipslink-orm.xml中,可以非常轻松地实现所有其他客户。 请记住,您可以根据需要随意命名这些文件,如果不使用默认名称,则只需更新persistence.xml文件以声明正在使用的名称即可

这种方法意味着,当我们要更新产品中的User时,我们只需要更新一个,并且只更新User POJO( 因为我们确保只有一个 )。 但是,当必须为特定客户添加特定属性时,我们无需触摸用户POJO代码。 我们简单地对XML进行更改,而不必重新编译核心产品中的任何内容。 当然,在任何时候,只要查看适当的eclipselink-orm.file,就可以轻松了解针对任何客户的定制。

是的 快乐扩展!

参考文献:

  1. 在都柏林的技术博客上,从我们的JCG合作伙伴 Alex Staveley 扩展您的JPA POJO
  2. http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Extensible_Entities
  3. http://www.eclipse.org/eclipselink/

相关文章 :

  • Spring Data JPA的持久层
  • 具有GlassFish和一致性的高性能JPA –第1部分
  • 避免懒惰的JPA集合
  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • Java Persistence API:快速入门

翻译自: https://www.javacodegeeks.com/2012/01/extending-your-jpa-pojos.html

jpa动态扩展sql

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

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

相关文章

手机 html 折叠效果,HTML5仿苹果手机的面板合拢折叠效果

passbook仿苹果手机的面板合拢折叠效果-html5特效.pocket{width:300px;height:460px;padding: 10px;overflow: hidden;float: left;border: 1px solid #EDEDED;margin: 4px;border-radius: 8px;box-shadow:0 -5px 30px rgba(0,0,0,0.2) inset;}.passcard {float: left;width:30…

Activiti中具有单独数据库模式的多租户

我们过去听到的一项功能请求是以多租户方式运行Activiti引擎&#xff0c;使租户的数据与其他租户的数据隔离。 当然&#xff0c;在某些云/ SaaS环境中&#xff0c;这是必须的。 几个月前&#xff0c;波恩大学的学生拉斐尔吉伦&#xff08;Raphael Gielen&#xff09;与我接触&…

dfs手写栈模板

在竞赛中如果系统栈很小的话&#xff0c;过深的递归会让栈溢出&#xff0c;这个时候我们就要自己手写栈&#xff0c;将递归转化成手工栈。 方法其实也很简单。 基本思路上&#xff0c;我们就是用栈不断的pop,push。但是何时push&#xff0c;何时pop呢&#xff1f; 在《算法导论…

html5自动把某个层放在屏幕底部,告诉你一个将 footer 保持在底部的最好方法

当你在布局网页时&#xff0c;有可能会遇到类似下面的这种情况broken_layout.png导致这一问题的原因是页面内容太少&#xff0c;无法将内容区域撑开&#xff0c;从而在 footer 下面留下一大块空白。本文将介绍一种现代化的方法&#xff0c;&#xfffd;确保 footer 始终处于页面…

前后数据交互(ajax) -- 初始化页面表格

// 初始化员工信息列表 function loadpage ( pageNum ) {var keywords $("#keywords").val();$("#tbody").html("");if ( isNaN(pageNum) ) {pageNum 1;}$.$.ajax({type: GET,url: contextPath "/getaccountList/" pageNum "…

html的扇形代码导航,CSS3--利用transform和transition属性制作扇形导航

在前面&#xff0c;我们已经讲解了transform这个属性以及案例&#xff0c;那么本文会进一步结合transform和transition两个属性&#xff0c;并制作一个简单的案例进行说明。一、transition属性说明接下来简单分析一下transition这个属性的定义以及子属性。1)ansition-property …

UCI数据

http://archive.ics.uci.edu/ml/datasets.html?format&task&att&area&numAtt&numIns&type&sortinstDown&viewtable转载于:https://www.cnblogs.com/zangrunqiang/p/5999238.html

常见的误解:这会创建多少个对象?

总览 一个常见的问题是一段代码创建多少个对象或多少个字符串。 答案通常不是您的想法&#xff0c;也不是您真正需要知道的。 了解何时创建对象是很有用的&#xff0c;但是有很多其他因素通常要考虑的重要得多&#xff0c;这可能意味着应用程序总数不是您所想的。 字符串不是一…

cvs配电保护断路器_电工电器(三)-配电电器-断路器类-剩余电流保护断路器

本文文字836&#xff0c;阅读时间6分钟左右。此系列文章 从配电电器的大类等进行慢慢阐述&#xff0c;有不足的地方 欢迎大家相互探讨交流。配电电器&#xff0c;顾名思义就是进行电力分配的设备。电&#xff0c;从发电机出来之后&#xff0c;由总线输出&#xff0c;不可能直接…

html模块殃射,【Web前端问题】webpack打包后,module模块中的函数无法在html标签的事件中调用?...

折腾了好久&#xff0c;求大佬指点~~最近才开始接触webpack以及ES6的module&#xff0c;可能理解的有问题吧。。。希望大佬来指点一下我这个菜鸟。我的想法是在一个module中定义函数&#xff0c;在HTML的中用onclick事件调用这个函数。module模块代码&#xff1a;— base.js —…

Linux网络参数设置

1、ifconfig 查询、设定网络卡与ip 设置桥接网络 # vi /etc/sysconfig/network-script/ifcfg-br0DEVICEbr0 #设备名称BOOTPROTOstatic #设置静态地址IP6INITnoMTU1500 #设置MTU连接数 (可以设定不同的MTU数值)NM_CONTROLLEDnoONBOOTyesIPADDR…

delhpi7 tcombobox清楚重复项_专利数据统计中需要搞清楚的首要问题(2)

上一篇专利数据统计中需要搞清楚的首要问题(1)介绍了通过合并申请号避免重复统计&#xff0c;理清了专利篇数和专利件数的问题&#xff0c;那么还有一类统计就是对发明项数的统计&#xff0c;这里就涉及到对同一项发明的重复统计问题。上一篇介绍的相同申请号但不同公开号的专利…

【Electron】Electron开发入门(八):自定义electron框架外壳(shell)的菜单(Menu)...

1.自定义electron框架外壳&#xff08;shell&#xff09;的菜单&#xff08;Menu&#xff09; electron的main.js里代码&#xff1a; const Menu require(electron).Menu; var template [{label: 关闭,click: function () { win.close();console.log("关闭")},// s…

交通大数据应用细分_盈海科技 | 交通大数据可视化“掘金”数据价值

面对日益拥堵的交通状况智能交通布局虽在不断完善但交通管理依旧收效甚微问题究竟出在了哪里&#xff1f;数据独立存储难以融合应用数据内在规律难寻数据可视化程度低……问题繁多 困难重重怎么办&#xff1f;&#xff1f;&#xff1f;交通大数据可视化解决方案上岗啦&#xff…

书评– Kubernetes Up&Running,作者:Kelsey Hightower

欢呼&#xff01; 正如我在以前的帖子中所写的那样&#xff0c;当您开始研究和使用所有这些新颖的&#xff0c;有光泽的容器/编排技术时&#xff0c;很有可能最终导致您的翻译“迷失”。 很多信息&#xff0c;很多技术&#xff0c;很多开发 &#xff0c;很多承诺&#xff0c;很…

relative布局html,CSS的四种布局方式static/relative/fixed/absolute

staticstatic布局是HTML元素默认的布局方式&#xff0c;并且static布局的元素不会受到top/left/bottom/right属性的影响。布局元素的位置即其在标准文档流中的位置。relative相对布局是相对其在标准文档流中的位置而言的。设置其top/left/bottom/right属性会使该元素脱离标准文…

MFC CListCtrl

列名、行内容的添加、删除。 据列名、行内容长度设置列宽。 排序。 提升权限 BOOL CDemoListCtrlApp::EnableDebugPrivilege() { HANDLE token; if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token)) { return FALSE; } TOKEN_PRIVILEGES tkp…

快手用旺旺瓶子做机器人_100品牌入榜,在快手的品牌运营怎么做?|11月快手品牌新势力榜揭晓...

11月榜单见证了许多新入驻快手的品牌迅速成长。母婴品牌「安慕斯」实现垂类专业场景剧情化&#xff0c;引起用户发注&#xff0c;激发用户参与&#xff0c;单月涨粉突破60万&#xff1b;服饰箱包运动垂类下的珠宝品牌「DR钻戒」以“一生唯一真爱”的理念抢占消费者心智&#xf…

认识计算机ppt课件游戏,《认识计算机》PPT课件

《认识计算机》PPT课件 认知主义认为 学习是个体对环 境的作用&#xff0c;而并不仅是环境刺激引起的行为改变&#xff1b;环境只能提供潜在刺激&#xff0c;至于这些潜在刺激是否受到注意或被加工&#xff0c;这主要取决于学习者内部的认知结构。 认 识 计 算 机 认知主义认为…

UITextView: 响应键盘的 return 事件(收回键盘)

UITextView: 响应键盘的 return 事件&#xff08;收回键盘&#xff09; 此篇文章将要介绍UITextView: 响应键盘的 return 事件&#xff08;收回键盘&#xff09;的相关介绍&#xff0c;具体实例请看下文 UITextView: 响应键盘的 return 事件 UITextFieldDelegate代理里面响应re…