我在Spring Boot文档中看到了JPA配置的这个属性spring.jpa.open-in-view=true.那么它被设置为true,它是默认值吗?
它到底意味着什么?我没有找到任何解释这种行为.
它应该是使用Hibernate SessionFactory来代替EntityManagerFactory?如果是,我该如何设置EntityManagerFactory?
感谢任何帮助.
谢谢!
我们正在为多个消费者开发 SaaS 解决方案。该解决方案基于 Spring、Wicket 和 Hibernate。我们的数据库包含来自多个客户的数据。我们决定对数据库建模如下:
为了使用此设置,我们使用具有以下 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) 我有一个 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什么也没做。
这让我想到两个问题:
@Transactional似乎什么也没做。其他相关类(仅显示相关部分!)
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 ×3
hibernate ×2
java ×2
jpa ×2
spring-boot ×2
multi-tenant ×1
servlets ×1
session ×1
spring-data ×1