在Spring Data JPA上实现多租户

时间:2017-06-17 03:53:53

标签: spring hibernate jpa spring-data-jpa

我计划使用Spring Data JPA作为持久层编写一个支持多租户的应用程序。但是,我并不打算为每个租户保留单独的数据库,而是将所有数据都放在一个数据库中。以下bean代表我计划实施的项目实体和租户实体。在获取项目或获取所有项目的列表时,我应该能够根据特定的租户过滤它们。我知道我可以通过编写bindByIdAndTenant_Id(int id,int id)等方法轻松地做到这一点,但我担心解决方案的可扩展性。我需要的是有一个像findById(int id)这样的方法,内容将由从上下文中获取的租户ID自动过滤。有没有办法在Spring Data JPA中做到这一点?

项目实体

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;}

1 个答案:

答案 0 :(得分:0)

(afaik)没有这样的“开箱即用”机制。 Spring如何知道如何识别租户以及分离数据的重要性。也许租户之间甚至会有一些共享数据,所以事情变得更加复杂,而且你可以自己做这件事。

我假设您的数据是使用网络层访问的,您必须在每次通话时识别租户。 “简单”路径参数或标题(没有任何进一步验证)太容易操作,因此令牌(JWT)可能是基于存储请求的租户信息的良好替代方案。这是关于该主题的nice articleAnother one正在讨论利弊,特别是与存储架构的差异有关。

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

相关问题