Тестирование бэкэнда Spring Boot с несколькими арендаторами завершается неудачей, поскольку у сеанса есть старый клиентJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Тестирование бэкэнда Spring Boot с несколькими арендаторами завершается неудачей, поскольку у сеанса есть старый клиент

Сообщение Anonymous »

У меня есть приложение Spring Boot, использующее Hibernate в многопользовательской настройке с общей базой данных и настройкой общей схемы. Схема создана с использованием liquibase.
Моя проблема в том, что приложение работает нормально, когда я запускаю его в обычном режиме.
Однако в тестах приложение терпит неудачу, поскольку сеанс базы данных все еще имеет арендатор по умолчанию.
Я тестирую базу данных H2 в памяти.
Соответствующие классы:

Код: Выделить всё

// holds the tenant id
public class TenantContext {

private TenantContext() {}

private static final ThreadLocal CURRENT_TENANT = new ThreadLocal();

public static Integer getCurrentTenant() {
return CURRENT_TENANT.get();
}

public static void setCurrentTenant(Integer tenant) {
CURRENT_TENANT.set(tenant);
}

public static void reset() {
CURRENT_TENANT.remove();
}
}

Код: Выделить всё

// provides the tenant id to hibernate
@Component
public class TenantResolver implements CurrentTenantIdentifierResolver, HibernatePropertiesCustomizer {

@Override
public Integer resolveCurrentTenantIdentifier() {
Integer tenant = TenantContext.getCurrentTenant();
if(tenant == null) return -1;
return tenant;
}

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

@Override
public void customize(Map hibernateProperties) {
hibernateProperties.put(MultiTenancySettings.MULTI_TENANT_IDENTIFIER_RESOLVER, this);
}
}

Код: Выделить всё

// Entity class
@Entity
@Getter
@Setter
@Builder(toBuilder = true)
@AllArgsConstructor
@NoArgsConstructor
@Table(schema = "MySchema", name = "MyTable")
public class MyEntity{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@TenantId
@Column(name = "tenant")
private Integer tenant;
}

Код: Выделить всё

public interface MyEntityRepository extends CrudRepository {}
Я не реализую MultiTenantConnectionProvider, поскольку у меня есть общая база данных и схема.
Тестовый класс выглядит следующим образом:

Код: Выделить всё

@SpringBootTest
@Transactional
@AutoConfigureMockMvc
@ActiveProfiles(profiles = "h2")
class MyEntityRepositoryTest{
@Autowired
MyEntityRepository myEntityRepository;

@Test
void createEntityWithTenant() {
TenantContext.setCurrentTenant(123);
MyEntity myEntity = new MyEntity();
MyEntity storedEntity = myEntityRepository.save(myEntity);
assertEquals(123, storedEntity.getTenant());
}
}
Это не удается, поскольку myEntity.getTenant() возвращает -1, арендатора по умолчанию.
Это связано с тем, что SessionImpl, выполняющий транзакцию, все еще имеет старый идентификатор арендатора с момента инициализации.

Код: Выделить всё

// this is from debugging inside InsertCoordinator#preInsertInMemoryValueGeneration
// https://docs.jboss.org/hibernate/stable/core/javadocs/org/hibernate/persister/entity/mutation/InsertCoordinator.html#preInsertInMemoryValueGeneration(java.lang.Object%5B%5D,java.lang.Object,org.hibernate.engine.spi.SharedSessionContractImplementor)

session.getTenantIdentifierValue(); // returns -1

session.getSessionFactory()
.getCurrentTenantIdentifierResolver()
.resolveCurrentTenantIdentifier() // returns 123

session.getSessionFactory()
.openSession()
.getTenantIdentifierValue() // returns 123

Я понятия не имею, что делать. Я думаю, что создание нового сеанса с обновленным идентификатором клиента возможно, но как мне заставить myEntityRepository использовать этот новый сеанс?

Подробнее здесь: https://stackoverflow.com/questions/785 ... -has-old-t
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»