org.springframework.dao.DataIntegrityViolationException после обновления spring-boot с 2.1.x до 2.2.x с использованием hibernate и spring-boot-data-jpa - PullRequest
0 голосов
/ 13 февраля 2020

При попытке обновить spring-boot с версии 2.1.12 до 2.2.4 застрял в DataIntegrityViolationException при попытке вставить несколько объектов в MySQL с помощью JPA.

Пример объекта:

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder(toBuilder = true)
@Table(name = "user")public class User {

    @Id
    @Column(name = "id")
    @JsonProperty("id")
    private String id;

    @PrimaryKeyJoinColumn
    @OneToOne(cascade = CascadeType.ALL)
    @JsonProperty("status")
    private UserStatus status;

}

И пользовательский статус:

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "user_status")
public class UserStatus {

    @Id
    @Column(name = "id")
    @JsonProperty("id")
    private String id;

    public UserStatus(String userId) {
        this.id = userId;
    }

}

Чтобы вставить объект в mysql Я использую репозиторий jpa по умолчанию:

@Repository
public interface UserRepository extends JpaRepository<User, String> { 
}

С spring-boot-2.1.x userRepository.save(user) работает нормально, но с 2.2.x возникает это исключение:

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

С этими данными в журнале:

Cannot add or update a child row: a foreign key constraint fails (`test`.`user_status`, CONSTRAINT `user_status_ibfk_1` FOREIGN KEY (`id`) REFERENCES `user` (`id`) ON DELETE CASCADE)

Если включить spring.jpa.show-SQL: true, я обнаружил, что с spring-boot-2.2.x вставка в сущность User не происходит, но со старой пружиной это происходит.

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

1 Ответ

0 голосов
/ 13 февраля 2020

spring-boot 2.1.12 использует Hibernate 5.3.15.Final и spring-boot 2.2.4 использует Hibernate 5.4.10.Final

Ваша проблема похожа на проблемы Hibernate HHH-13413 HHH-13171

Причина в исправлении HHH-12436 , которое было введено в 5.4.0.CR1, поэтому с тех пор сопоставления один к одному не работает, когда @OneToOne (mappedBy = "") не предоставлен.

И как я понял из дискуссий в JIRA, теперь это не ошибка. Была ошибка, и они исправили это так. Я думаю, что с @PrimaryKeyJoinColumn есть какое-то недопонимание, поэтому люди не используют его правильно.

Я думаю, это решит проблему

@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
@JsonProperty("status")
private UserStatus status;
...