无法使用休眠分区(鉴别器)数据方法实现多租户

问题描述 投票:0回答:0

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


spring-boot hibernate multi-tenant
© www.soinside.com 2019 - 2024. All rights reserved.