org.springframework.dao.DataIntegrityViolationException 更新后 spring-boot 从 2.1.x 到 2.2.x 使用休眠和 spring-boot-data-jpa
org.springframework.dao.DataIntegrityViolationException after update spring-boot from 2.1.x to 2.2.x using hibernate and spring-boot-data-jpa
尝试更新 spring 时-从版本 2.1.12 引导到 2.2.4 在尝试使用 JPA 将多个对象插入 MySQL 时卡在 DataIntegrityViolationException 上。
示例对象:
@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
实体,但旧的 spring 这是。
我没有发现 spring-boot 连接到 hibernate 有任何重大变化,相应更新后 hibernate 本身也没有重大变化。
是否有任何未在发行说明中描述的更新?
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
原因在于 5.4.0.CR1 中引入的修复程序 HHH-12436,因此从那时起,一对一映射在 @OneToOne(mappedBy ="") 无效时不起作用假如。
正如我从 JIRA 中的讨论中了解到的那样,它现在不是错误。有一个错误,他们就这样修复了。我想 @PrimaryKeyJoinColumn
有一些误解,所以人们没有正确使用它。
我想这会解决问题
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
@JsonProperty("status")
private UserStatus status;
尝试更新 spring 时-从版本 2.1.12 引导到 2.2.4 在尝试使用 JPA 将多个对象插入 MySQL 时卡在 DataIntegrityViolationException 上。
示例对象:
@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
实体,但旧的 spring 这是。
我没有发现 spring-boot 连接到 hibernate 有任何重大变化,相应更新后 hibernate 本身也没有重大变化。 是否有任何未在发行说明中描述的更新?
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
原因在于 5.4.0.CR1 中引入的修复程序 HHH-12436,因此从那时起,一对一映射在 @OneToOne(mappedBy ="") 无效时不起作用假如。
正如我从 JIRA 中的讨论中了解到的那样,它现在不是错误。有一个错误,他们就这样修复了。我想 @PrimaryKeyJoinColumn
有一些误解,所以人们没有正确使用它。
我想这会解决问题
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
@JsonProperty("status")
private UserStatus status;