#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:
- FK находится в адресной таблице. ID — это FK и PK
- Объекты имеют общий идентификатор, идентификатор одинаков в обеих таблицах
РЕДАКТИРОВАНИЕ 1: я обнаружил, что ошибка возникает в версии 2.2.X. В версии 2.1.X она работает отлично.
EDIT2: если я инвертирую аннотацию @JoinColumn с помощью mappedBy, она будет работать в версии 2.2.X. Я хочу знать, почему
Комментарии:
1. Скорее всего, вы не установили обе стороны отношения перед сохранением.
user.setAdress(...)
иaddress.setUser(...)
2. Я сделал это, я отредактирую, я просто разместил эти классы в качестве примера. Он отлично работает в предыдущей версии @AlanHay