Interface TenantAware

All Known Implementing Classes:
TenantAwareEntity

public interface TenantAware

租戶感知介面

標記需要多租戶數據隔離的 Entity。實作此介面的 Entity 應具備 tenantId 欄位,並搭配 Hibernate Filter 實現自動過濾。

實作建議

方式 1:直接實作介面

@Entity
@Filter(name = "tenantFilter", condition = "tenant_id = :tenantId")
public class Customer implements TenantAware {

    @Column(name = "tenant_id", nullable = false, updatable = false)
    private String tenantId;

    @Override
    public String getTenantId() { return tenantId; }

    @Override
    public void setTenantId(String tenantId) { this.tenantId = tenantId; }
}

方式 2:建立應用層級的基類(推薦)

@MappedSuperclass
@FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "tenantId", type = String.class))
public abstract class TenantAwareEntity implements TenantAware {

    @Column(name = "tenant_id", nullable = false, updatable = false)
    private String tenantId;

    @Override
    public String getTenantId() { return tenantId; }

    @Override
    public void setTenantId(String tenantId) { this.tenantId = tenantId; }

    @PrePersist
    protected void onPrePersist() {
        if (tenantId == null) {
            tenantId = TenantContext.getCurrentTenantId();
        }
    }
}

Hibernate Filter 設定

  • 在基類上使用 @FilterDef 定義 filter
  • 在每個 Entity 上使用 @Filter 啟用 filter
  • 使用 TenantFilterSupport 在請求開始時啟用 filter
See Also:
  • Method Summary

    Modifier and Type
    Method
    Description
    取得此 Entity 所屬的租戶 ID
    void
    setTenantId(String tenantId)
    設定此 Entity 所屬的租戶 ID
  • Method Details

    • getTenantId

      String getTenantId()
      取得此 Entity 所屬的租戶 ID
      Returns:
      租戶 ID
    • setTenantId

      void setTenantId(String tenantId)

      設定此 Entity 所屬的租戶 ID

      通常在 @PrePersist 時自動設定,不應手動呼叫。

      Parameters:
      tenantId - 租戶 ID