Каким образом можно использовать Hibernate для добавления записей в две таблицы одновременно?

Каковы методы для добавления пользователей и их информации в отдельные таблицы и связывания их друг с другом?
  • 28 октября 2023 г. 15:38
Ответы на вопрос 4
Для добавления записей в две таблицы одновременно и связывания их друг с другом с помощью Hibernate, можно использовать следующий подход:

1. Определите классы сущностей для каждой таблицы. Например, классы User и UserInfo.

```java
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private UserInfo userInfo;

    // Геттеры, сеттеры и другие поля и методы
}

@Entity
@Table(name = "user_info")
public class UserInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String firstName;

    private String lastName;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    // Геттеры, сеттеры и другие поля и методы
}
```

2. Определите метод для добавления пользователей и информации о них. В методе создайте объекты User и UserInfo, установите их свойства и свяжите их друг с другом.

```java
@Transactional
public void addUserAndInfo(String username, String firstName, String lastName) {
    User user = new User();
    user.setUsername(username);

    UserInfo userInfo = new UserInfo();
    userInfo.setFirstName(firstName);
    userInfo.setLastName(lastName);
    userInfo.setUser(user);

    user.setUserInfo(userInfo);

    entityManager.persist(user);
}
```

3. При вызове метода addUserAndInfo передайте значения для имени пользователя и его информации.

```java
userService.addUserAndInfo("username", "firstName", "lastName");
```

При выполнении кода Hibernate автоматически сохранит объекты User и UserInfo в соответствующие таблицы и установит связь между ними.

Обратите внимание на использование аннотаций @OneToOne, @JoinColumn, а также параметров mappedBy и cascade в классах сущностей. Они определяют связь между таблицами, используя внешний ключ и обеспечивают автоматическое сохранение связанных объектов при сохранении основного объекта. Каскадное удаление также может быть настроено, если требуется удалить связанные записи при удалении основной записи.
при таком виде связи возможно пропущен сеттер. JPA не может автоматически выполнить эту операцию. Рекомендуется добавить сеттер для поля "userInfo".  
 userInfo.setUser(null); можно заменить на this.userInfo = null; 
 userInfo.setUser(this); можно заменить на this.userInfo = userInfo;
Похожие вопросы