2017-06-17 387 views
0

我打算编写一个使用Spring Data JPA作为持久层的多租户感知应用程序。但是我不打算为每个租户保留单独的数据库,而是将所有数据都放在一个数据库中。以下豆代表我打算实施的项目实体和租户实体。在获取项目或获取所有项目列表时,我应该能够根据特定租户进行过滤。我知道我可以通过编写像bindByIdAndTenant_Id(int id,int id)这样的方法来实现这一点,但我担心解决方案的可伸缩性。我需要的是有一个像findById(int id)这样的方法,并且内容将被从上下文中获取的tenant id自动过滤。有没有办法在Spring Data JPA中做到这一点?在Spring数据上实现多租户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;} 
+0

您可以尝试使用作为某些JPA实现的扩展提供的多租户功能(请参阅例如https://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant和here:https:// docs。 jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/multitenancy/MultiTenancy.html)。在撰写本文时,您的用例(即使用鉴别器列)在Hibernate中未实现。但是,它在EclipseLink中得到了支持。 – crizzis

回答

0

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

我假定您的数据是使用Web层访问的,您必须在每次调用时标识租户。一个“简单”路径参数或标题(无需进一步验证)太容易操作,所以也许令牌(JWT)是存储基于请求的租户信息的不错选择。这里是关于这个话题的nice articleAnother one正在讨论优点和缺点,特别是与存储架构的差异有关。

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