Можно ли сохранить несколько разных сущностей в рамках одной транзакции JPA/Hibernate?

«Можно ли сохранить несколько разных сущностей в рамках одной транзакции JPA/Hibernate?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, это стандартная и ожидаемая практика. Одна транзакция может включать операции с любым количеством сущностей и даже с разными их типами.

Ключевое условие: Все операции должны выполняться в контексте одного и того же EntityManager (или Hibernate Session).

Пример (JPA):

@Entity
public class User { /* ... */ }

@Entity
public class Order { /* ... */ }

// В сервисном слое
@Transactional // Управление транзакцией через Spring
public void createUserWithOrder(String userName, String orderDetails) {
    // Все действия внутри одного EntityManager и транзакции
    User user = new User(userName);
    entityManager.persist(user); // Сохраняем первую сущность

    Order order = new Order(orderDetails, user);
    entityManager.persist(order); // Сохраняем вторую сущность

    // При коммите Spring/JPA сформирует и отправит INSERT для обоих объектов
}

Преимущество (Atomicity — Атомарность): Если на любом этапе (например, при сохранении Order) произойдет ошибка, вся транзакция откатится (rollback). Это гарантирует, что в базе данных не останется частично сохраненных данных (например, User без Order).