水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源。 他们从Oracle的Shaun Smith( 博客 / twitter )获得了关于EclipseLink作为开源项目的地位和未来的演讲。 他介绍了将在EclipseLink 2.4中提供的所有新功能,这些功能将与June Eclipse Juno发行版一起提供。 详细来说,这些是REST,NoSQL和Multitenancy。 (详细信息请参阅marsjug事件的完整幻灯片(PDF) 。)

我喜欢看到EclipseLink仍然是Java持久性创新的中心,并且他们正在努力及时采用最新的动态更新。 总的来说,我为一个较为保守的行业工作,我正在寻找的主要新功能是多租户。 您可以从幻灯片中猜测,该字段中的某些内容应该已经可以与最新的EclipseLink 2.3.0一起使用。

多租户将是什么样子?
让我们开始看什么Oracle的琳达DeMichiel在过去几年的JavaOne(对比宣布博客-后 ),也让我们了解一下什么的早期草案(PDF)的JPA 2.1规范所提供的。 较容易的部分是早期草案。 在任何情况下,没有一行提到“ Multitenan [t | cy]”。 因此,对于进一步的迭代来说,这显然仍然是一件大事。 在JavaOne策略主题演讲 (幻灯片41,42)和JavaOne技术主题演讲(PDF) (幻灯片25)中可以找到更多信息。 通用Java EE 7方法将为不同租户支持同一应用程序的单独隔离实例。 映射应由容器完成,并以某种方式可供应用程序使用。 直到今天,这都是非常模糊的,幻灯片中唯一可用的具体代码示例使用两个注释@Multitenant和@TenantDiscriminatorColumn引用了一些明显的JPA相关示例。 嗯 这看起来对您不熟悉吗?

今天有什么可能?
是的! EclipseLink(从2.​​3.0版开始-Indigo)使用承租人区分符列支持共享的多承租人表,从而允许将一个应用程序重新用于多个承租人并将其所有数据放置在一起。 所有租户共享相同的架构而彼此之间不知道,并且可以照常使用非多租户实体类型。 但是请注意,这只是数据多租户的一种可能方法。 这通常称为“专用数据库”,因为所有租户的数据都进入一个单独的数据库中! 以下是基本原则: –应用程序实例处理多个租户 – JPA必须隔离每个租户的缓存 您可以在专用的EclipseLink Wiki页面上查看所有详细信息。 想要试驾吗? 开始吧。 像往常一样先决条件(NetBeans,GlassFish,MySQL,如果需要更多帮助,请比较旧文章。)。 确保具有正确的EclipseLink依赖项(至少2.3.0)! 通过向导创建一个新实体,设置数据源和persistence.xml并将其命名为“客户”。

@Entity
public class Customer implements Serializable {
//...
}

如果启动您的应用程序,则会看到EclipseLink在数据库中创建类似这样的内容。

让我们使其成为一个多租户实体。 添加以下注释:

@Entity
@Multitenant
@TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code")
public class Customer implements Serializable {
//...
}

有多种用法选项可用于如何在具有@Multitenant实体类型的应用程序中使用EclipseLink JPA持久性单元。 由于不同的租户将只能访问其行,因此必须配置持久层,以使来自不同租户的实体不会出现在同一缓存中。 如果您比较详细的方法(专用PC,每个租户PC,每个租户PU),您会发现,到今天为止,您可以通过容器管理的PC或PU注入实现两种可能的选择。 让我们首先尝试最简单的方法。

专用持久性单元
在这种用法中,每个租户都定义了一个持久性单元,应用程序/容器必须为其租户请求正确的PersistenceContext或PersistenceUnit。 只有一个持久性单元,没有共享的内容。 继续上面的示例,然后将以下属性添加到persistence.xml中:

<property name="company-tenant.code" value="TENANT1" />

试试看,比较表。

如您所见,现在您有了companyId列。 如果插入一些数据,它将始终被在persistence.xml中分配的属性值填充。 使用@PersistenceContext或@PersistenceUnit访问您的实体。 使用这种方法,您可以像平常一样为应用程序共享一个缓存。

具有共享缓存的@PersistenceContext(来源:S.Smith)

每个租户的持久性上下文
如果不想每个应用程序有一个租户,则可以决定在persistence.xml中具有一个持久性单元定义,并在应用程序中具有一个共享的持久性单元(EntityManagerFactory和缓存)。 在这种情况下,需要在运行时为每个EntityManager指定承租人上下文。 在这种情况下,您可以使用常规实体类型的共享缓存,但是@Multitenant类型必须在缓存中受到保护。 您可以通过指定一些属性来做到这一点:

@PersistenceUnit
EntityManagerFactory emf;
Map props = new HashMap();
props.put("company-tenant.code", "TENANT2");
props.put(PersistenceUnitProperties.MULTITENANT_SHARED_EMF, true);
EntityManager em = emf.createEntityManager(props);
每个租户共享@PersistenceUnit(来源:S.Smith)

鉴别方法
上面的示例使用单个区分符租户列。 您可以通过指定primaryKey属性,将discriminator列添加到PK,如下所示:

@TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code", primaryKey = true)

如果执行以下操作,则也可能使用多个表使用多个租户区分符列:

@Entity
@SecondaryTable(name = "TENANTS")
@Multitenant
@TenantDiscriminatorColumns({@TenantDiscriminatorColumn(name = "TENANT_ID", contextProperty = "company-tenant.id", length = 20, primaryKey = true),@TenantDiscriminatorColumn(name = "TENANT_CODE", contextProperty = "company-tenant.code", discriminatorType = DiscriminatorType.STRING, table = "TENANTS")
})

这将导致辅助租户表。

其他物品
与往常一样,您也只能在persistence.xml中进行完整的配置。 作为参考,请查看已经提到的Wiki页面。 最后一件事很有趣。 您也可以将“租户区分符”列与您的实体对应。 您只需确保未更新或插入它即可。

@Basic@Column(name = "TENANT_ID", insertable = false, updatable = false)private int tenantId;public int getTenantId() {return tenantId;}

查看调试输出,您可以了解幕后情况:

INFO:获取EntityManager
INFO:插入测试客户
FEIN:插入客户(ID,TENANT_ID)值(?,?) 绑定=> [1,2] FEIN:插入租户(ID,TENANT_CODE)的值(?,?) 绑定=> [1,TENANT2] FEIN:从客户t0,租户t1中选择t0.ID,t1.TENANT_CODE,t0.TENANT_ID,t1.ID((((t1.ID = t0.ID)和(t1.TENANT_CODE =?)))和(t0.TENANT_ID =?)) 绑定=> [TENANT2,2]

是否对更多Java EE 7和JPA 2.1好东西感兴趣? 使用EclipseLink JPA 2.1项目的开发状态Wiki页面保持更新。

参考: Java EE 7的最高峰–来自我们JCG合作伙伴的 EclipseLink的多租户示例   Markus Eisele在Enterprise Software Development with Java博客上。

翻译自: https://www.javacodegeeks.com/2012/02/sneak-peak-at-java-ee-7-multitenant.html

Java EE 7的高峰–使用EclipseLink的多租户示例相关推荐

  1. eclipselink_Java EE 7的高峰– EclipseLink的多租户示例

    eclipselink 水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源. 他们从Oracle的Shaun Smith( 博客 / 推特 )获取了有关Eclipse ...

  2. java ee maven_真正释放Maven和Java EE的强大功能

    java ee maven 如果野心和愿景太复杂而无法使用,则它们可能会淘汰伟大的解决方案. 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术,但是使用它们并使用其作者打算使用的 ...

  3. days to_days_Java2Days 2012:Java EE

    days to_days Java2Days会议是东欧的主要活动,目的是介绍Java开发的最新趋势. 今年,该活动于10月25日至26日在保加利亚的索非亚举行. 我在那里,并有机会与一些来自SAP的同 ...

  4. 真正释放Maven和Java EE的强大功能

    如果野心和愿景太复杂而无法使用,那么它们可能会毁灭伟大的解决方案. 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术,但是使用它们并使用其作者希望您使用的所有技术和模式来设计项目 ...

  5. Java EE状态会话Bean(EJB)示例

    在本文中,我们将了解如何在简单的Web应用程序中使用状态会话Bean来跟踪客户端会话中的状态. 1.简介 有状态会话Bean通常保存有关特定客户端会话的信息,并在整个会话中保留该信息(与无状态会话Be ...

  6. Java2Days 2012:Java EE

    Java2Days会议是东欧的主要活动,目的是介绍Java开发的最新趋势. 今年,该活动于10月25日至26日在保加利亚的索非亚举行. 我在那里,并有机会与一些SAP的同事一起品尝了一些最新的Java ...

  7. 微服务:Java EE的拯救者还是掘墓人?

    有人认为,微服务的大行其道是在给Java EE下达死刑判决书.也有人认为,Java EE已死的论调可笑至极.读者朋友,你们怎么看? 引言 有人说,Java确实过于臃肿,经常"小题大做&quo ...

  8. payara 创建 集群_使用Payara Micro的Easy Java EE Microservices

    payara 创建 集群 想知道如何开始使用Java EE Microservices? 使用Java EE API部署微服务只需要几个快速步骤. 许多人认为Java EE对于与微服务一起使用而言过于 ...

  9. jpa root.join_JPA 2.1和Java EE 7中的JPQL增强功能(第1部分– JOIN ON)

    jpa root.join Java EE 7已经存在了几年,并且提供了一些非常有用且期待已久的功能,例如实体图以及对存储过程和结果映射的更好支持. 有关概述,请参阅Thorben Janssen的博 ...

最新文章

  1. python发送文件到邮箱_python发送文件夹内容到邮箱
  2. 转盘在转动的同时ajax异步加载,用jQuery旋转插件jqueryrotate制作转盘抽奖.pdf
  3. 前端框架:执行流程分析之路由与菜单
  4. 全国计算机一级d类考试内容,全国计算机一级考试WPS office复习题及答案2017
  5. centos jupyter 安装_centos7安装 jupyter
  6. 小数分数转换c语言,这是把小数转换成分数的程序,可是输入0.6666无限循环
  7. leetcode24题:两两交换链表的节点
  8. 为什么Linux不需要磁盘碎片整理
  9. win7 IIS7 HTTP 错误 404.2 - Not Found的解决方法
  10. 【WePY小程序框架实战四】-使用asyncawait异步请求数据
  11. 用汇编语言实现c语言程序例题,C语言详细例题大全
  12. coreseek java_lnmp+coreseek实现站内全文检索(安装篇)
  13. 配置vps服务器,拨号换ip(一)
  14. UBUNTU学习笔记
  15. 音乐流媒体服务器Gonic
  16. 【解决方案】关于自动生成表hibernate_sequence的问题
  17. 操作系统(一)——绪论
  18. uvc和v4l2简介
  19. iterable、iterator和iter()
  20. 小盒马,大永辉,“大润发们”的未来怎么“大发”?

热门文章

  1. Springboot(十):邮件服务
  2. java 反射api_反射是最重要的Java API
  3. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
  4. spock 集成测试_Spock 1.2 –轻松进行集成测试中的Spring Bean模拟
  5. jvm 宕机 打印jvm_通过入侵JVM打印阵列
  6. maven将第三方依赖_如何将商业第三方文物整合到您的Maven版本中
  7. Quarkus的其他(非标准)CDI功能
  8. oop 类和对象的_实用程序类的OOP替代
  9. solr 模糊匹配_Solr中的前缀和后缀匹配
  10. orm java_Java 8 Friday:不再需要ORM