因为 hibernate-core 版本 6.x 支持单表多租户方法。我想在我的 spring-boot 应用程序中实现相同的功能。我从现在开始尝试了几天,但无法找到我究竟如何做到这一点的解决方案。
最初我更新了我的 pom.xml 以将 hibernate-core 从 5.2 设置为 6.2.Final(通过从 Spring-data-starter-jpa 依赖项中排除相同的内容。然后我添加了 TenantIdentifierResolver 但我一个接一个地收到错误。可以有人请告诉我是否可以使用休眠在 spring boot 中实现单表多租户。
package com.ayush.csi2.iopa.selfonboarding.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Component
@Slf4j
public class TenantIdentifierResolver implements CurrentTenantIdentifierResolver,
HibernatePropertiesCustomizer {
@Override
public String resolveCurrentTenantIdentifier() {
return resolveTenantByHttpSession();
}
@Override
public boolean validateExistingCurrentSessions() {
return false;
}
@Override
public void customize(Map<String, Object> hibernateProperties) {
hibernateProperties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, this);
}
public String resolveTenantByHttpSession() {
HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String currentTenant = req.getHeader("x-tenant-id");
if(Strings.isBlank(currentTenant)) {
return "USGM";
}
return currentTenant;
}
}
package com.ayush.iopa.selfonboarding.entity;
import com.walmart.csi2.iteminsights.iop.selfonboarding.constants.Detector;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import javax.persistence.*;
import java.util.Date;
import java.util.UUID;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Builder
@Table(name = "ApplicationDetail")
public class ApplicationDetail {
@Id
@Column(name = "id", nullable = false, unique = true)
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@Type(type= "uuid-char")
private UUID id;
@Column(name = "appName", nullable = false, unique = true)
private String appName;
@Column(name = "ownerId")
private String ownerId;
@Column(name = "description")
private String description;
@Column(name = "slackChannels")
private String slackChannels;
@Column(name = "emailIds", nullable = false)
private String emailIds;
@Column(name = "createdBy", nullable = false)
private String createdBy;
@Column(name = "createdDtm", nullable = false)
private Date createdDtm;
@Column(name = "modifiedDtm")
private Date modifiedDtm;
@Column(name = "modifiedBy")
private String modifiedBy;
@Column(name = "authorizedUsers")
private String authorizedUsers;
@Generated(value = GenerationTime.NEVER)
@Column(name = "imperiumAppId")
private Long imperiumAppId;
@Column(name = "detector")
@Enumerated(EnumType.STRING)
private Detector detector;
@Column(name = "tenantId")
private String tenantId;
}