Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spring数据JPA上实现多租户_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

在Spring数据JPA上实现多租户

在Spring数据JPA上实现多租户,spring,hibernate,jpa,spring-data-jpa,Spring,Hibernate,Jpa,Spring Data Jpa,我计划使用SpringDataJPA作为持久层来编写一个支持多租户的应用程序。但是,我不打算为每个租户保留单独的数据库,而是将所有数据保存在一个数据库中。下面的bean表示我计划实现的项目实体和租户实体。当获取一个项目或获取所有项目的列表时,我应该能够根据特定的租户筛选它们。我知道我可以通过编写bindByIdAndTenant_Id(int-Id,int-Id)这样的方法轻松做到这一点,但我担心解决方案的可伸缩性。我需要的是像findById(intid)这样的方法,内容将由从上下文中获取的租

我计划使用SpringDataJPA作为持久层来编写一个支持多租户的应用程序。但是,我不打算为每个租户保留单独的数据库,而是将所有数据保存在一个数据库中。下面的bean表示我计划实现的项目实体和租户实体。当获取一个项目或获取所有项目的列表时,我应该能够根据特定的租户筛选它们。我知道我可以通过编写bindByIdAndTenant_Id(int-Id,int-Id)这样的方法轻松做到这一点,但我担心解决方案的可伸缩性。我需要的是像findById(intid)这样的方法,内容将由从上下文中获取的租户id自动过滤。在SpringDataJPA中有没有一种方法可以做到这一点

项目实体

public class Project {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private int id;

@Column(name = "NAME")
private String name;

@Column(name = "DESCRIPTION")
private String description;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TENANT_ID", referencedColumnName = "id", foreignKey = @ForeignKey(name = "FK_TENANT_IN_PROJ"))
private Tenant tenant;}
承租人实体

public class Tenant {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
int id;

@Column(name = "NAME", unique = true)
private String name;}
没有这种“开箱即用”的机制。Spring应该如何知道如何识别租户以及分离数据的重要内容。也许租户之间甚至有一些共享数据,所以事情会变得更复杂,这完全取决于你自己

我假设您的数据是通过web层访问的,您必须在每次通话中识别租户。“简单”路径参数或标头(无需任何进一步验证)太容易操作,因此令牌()可能是存储基于请求的租户信息的良好替代方法。这里有一个关于这个主题的例子。正在讨论优缺点,特别是与存储体系结构的差异有关


就我个人而言,我倾向于采用“不同数据库”的方法。它很容易向外扩展,并且用户数据被正确地分离。此外,每个租户都可以使用备份和恢复机制,而不会影响其他用户。至少为每个租户使用不同的模式,但这可能取决于数据库以及“模式”的确切含义。

您可以尝试使用作为某些JPA实现扩展提供的多租户功能(例如,请参见此处:和此处:)。在撰写本文时,您的用例(即使用鉴别器列)没有在Hibernate中实现。然而,它在EclipseLink中得到了支持。