Родительский ключ не найден после обновления spring boot с 2.1.1 до 2.2.10

#java #spring #spring-boot #hibernate #spring-data-jpa

#java #spring #spring-boot #спящий режим #spring-data-jpa

Вопрос:

У меня ошибка ORA-02291: нарушено ограничение целостности (ADDRESS_R01) — родительский ключ не найден после обновления версии Spring boot в моем приложении. Ошибка возникает при вызове функции UserRepository.save, которая должна сначала вызвать сохранение в таблице users, а затем в таблице адресов.

Когда я включаю show_sql, я вижу, что происходит то, что адрес сохраняется перед пользователями, и выдается ошибка, приведенная выше. Чего не было в предыдущей версии.

Если я понизил spring boot до 2.1.1, которая была предыдущей версией, все работает нормально. Я хочу знать, в чем может быть проблема, поскольку я не смог найти никаких ссылок на эту проблему, связанную с версией spring boot.

Связь между этими двумя таблицами представлена в классах ниже с использованием аннотации @OneToOne.

PS: это не весь класс, это всего лишь пример того, как обрабатывается корабль отношений. Как вы можете видеть, идентификатор столбца в users также используется в аннотации @JoinColumn.

 @Builder
@AllArgsConstructor
@Entity
@Table(name = "USERS")
public class UserEntity {
  @Id
  @Column(name = "id", unique = true, nullable = false, length = 40)
  public String getId()
  {
    return this.id;
  }

  @Column(name = "FIRST_NAME", length = 75, nullable = false)
  @NotNull
  public String getFirstName()
  {
    return this.firstName;
  }

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "id", unique = true, nullable = false)
  public Address getAddress() {
    return address;
  }

  public void setAddress(Address address) {
    this.address = address;
  }
 

И адрес объекта, который выглядит следующим образом:

 @Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
@Entity
@Table(name = "ADDRESS")
public class Address {

  @Id
  @Column(
      name = "id",
      unique = true,
      nullable = false,
      length = 40)
  public String getId() {
    return id;
  }

  @OneToOne(cascade = CascadeType.ALL, mappedBy = "address", fetch = FetchType.LAZY)
  public UserEntity getUser() {
    return this.user;
  }

  public void setUser(UserEntity user) {
    this.user = user;
  }
 

PS:

  1. FK находится в адресной таблице. ID — это FK и PK
  2. Объекты имеют общий идентификатор, идентификатор одинаков в обеих таблицах

РЕДАКТИРОВАНИЕ 1: я обнаружил, что ошибка возникает в версии 2.2.X. В версии 2.1.X она работает отлично.

EDIT2: если я инвертирую аннотацию @JoinColumn с помощью mappedBy, она будет работать в версии 2.2.X. Я хочу знать, почему

Комментарии:

1. Скорее всего, вы не установили обе стороны отношения перед сохранением. user.setAdress(...) и address.setUser(...)

2. Я сделал это, я отредактирую, я просто разместил эти классы в качестве примера. Он отлично работает в предыдущей версии @AlanHay