相关疑难解决方法(0)

Spring Boot中的spring.jpa.open-in-view = true属性是什么?

我在Spring Boot文档中看到了JPA配置的这个属性spring.jpa.open-in-view=true.那么它被设置为true,它是默认值吗?

它到底意味着什么?我没有找到任何解释这种行为.

它应该是使用Hibernate SessionFactory来代替EntityManagerFactory?如果是,我该如何设置EntityManagerFactory

感谢任何帮助.

谢谢!

java spring jpa spring-data spring-boot

88
推荐指数
3
解决办法
6万
查看次数

Hibernate 多租户:在会话中更改租户

我们正在为多个消费者开发 SaaS 解决方案。该解决方案基于 Spring、Wicket 和 Hibernate。我们的数据库包含来自多个客户的数据。我们决定对数据库建模如下:

  • public
    所有客户之间的共享数据,例如用户帐户,因为我们不知道用户属于哪个客户
  • 客户_1
  • 客户_2
  • ...

为了使用此设置,我们使用具有以下 TenantIdentifierResolver 的多租户设置:

public class TenantProviderImpl implements CurrentTenantIdentifierResolver {
    private static final ThreadLocal<String> tenant = new ThreadLocal<>();

    public static void setTenant(String tenant){
        TenantProviderImpl.tenant.set(tenant);
    }

    @Override
    public String resolveCurrentTenantIdentifier() {
        return tenant.get();
    }

    @Override
    public boolean validateExistingCurrentSessions() {
        return false;
    }

    /**
     * Initialize a tenant by storing the tenant identifier in both the HTTP session and the ThreadLocal
     *
     * @param   String  tenant  Tenant identifier to be stored
     */ …
Run Code Online (Sandbox Code Playgroud)

java session spring hibernate servlets

5
推荐指数
1
解决办法
4233
查看次数

Spring Boot + Hibernate 多租户:@Transactional 不起作用

我有一个 Spring Boot 2 + Hibernate 5 多租户应用程序连接到单个 PostgreSQL 数据库。我已经根据这些指南进行了设置:

只要我在访问控制器端点之前在过滤器或拦截器中设置tenantId,就可以正常工作。

但是,我需要在控制器内设置租户,如下所示:

@RestController
public class CarController {
    @GetMapping("/cars")
    @Transactional
    public List<Car> getCars(@RequestParam(name = "schema") String schema) {
        TenantContext.setCurrentTenant(schema);
        return carRepo.findAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

但此时已经检索到连接(对于公共模式)并且设置TenantContext没有任何效果。

我认为@Transactional应该强制该方法在单独的事务中运行,因此 Hibernate 会话的创建将被推迟到carRepo.findAll()调用该方法为止。情况似乎并非如此,因为@Transactional什么也没做。

这让我想到两个问题:

  1. 如何在请求期间推迟 Hibernate 会话的创建,直到我设法根据过滤器/拦截器中不可用的某些逻辑设置正确的租户?@Transactional似乎什么也没做。
  2. 如何在同一请求或代码块中与不同模式进行交互?想象一下,1 个存储库仅在公共模式中可用,而 1 个存储库在租户模式中可用。

其他相关类(仅显示相关部分!)

MultiTenantConnectionProviderImpl.java:

@Component
public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider {
    @Override
    public Connection getConnection(String tenantIdentifier) throws SQLException {
        final Connection connection = getAnyConnection(); …
Run Code Online (Sandbox Code Playgroud)

spring hibernate jpa multi-tenant spring-boot

4
推荐指数
1
解决办法
4006
查看次数