2017-06-17 49 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正在討論優點和缺點,特別是與存儲架構的差異有關。

就我個人而言,我傾向於「不同的數據庫」方法。很容易擴展並且用戶數據被正確分離。另外,每個租戶都可以使用備份和恢復機制,而不會影響其他用戶。至少爲每個租戶使用不同的模式,但可能取決於數據庫以及「模式」的含義。