水族馆是有关所有相关规范和参考实现中有关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. 简单分析beyond作曲
  2. 思科2015校园招聘笔试面试总结
  3. 树形菜单 php,简单的树形菜单_php
  4. 149. Max Points on a Line同一条线上的最多点数
  5. 掌握Node.js中的Async和Await
  6. 【干货分享】云服务平台的架构及优势(上)
  7. redis hash结构如何设置过期时间
  8. Build 2017 | 一文看懂微软 Build 2017 大会:让 AI 走向边缘
  9. SpringBoot 自动配置实现流程
  10. python求成绩平均值_(生活)使用Python计算学生成绩平均值
  11. 使用AIR中的File对象
  12. 2017年值得学习的3个CSS特性
  13. Spring 的 ApplicationEvent and ApplicationListener
  14. SpringBoot学习(一)初识SpringBoot、第一个SpringBoot程序
  15. ioca0中断 pic单片机_PIC单片机学习心得
  16. Podfile 文件模板
  17. 使用arduino控制多个PCA968516路舵机控制板从而达到最多可以控制992个伺服舵机
  18. 统计分析软件_强大的多元统计分析软件-Mplus
  19. [译]写给初学者的Tensorflow介绍 - 2
  20. CSS的压缩 方法与解压

热门文章

  1. 一篇总结的很好的Spring data jpa 文章,里面包含多种查询方式,可以结合api使用
  2. java jwt 验证_教程:用Java创建和验证JWT
  3. jdk11 默认收集器_JDK 11:新的默认收集方法toArray(IntFunction)
  4. chameleon 算法_使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试...
  5. jdbc select语句_SELECT语句使用JDBC和Hibernate批量获取
  6. 如何在AWS中启动EC2实例
  7. 如何使用用户数据脚本在EC2实例上安装Apache Web Server
  8. 无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)
  9. 创新设计模式:工厂模式
  10. Java 8:默认方法解析规则