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