一次更新父和子记录抛出StackOverflowError



我目前正在尝试在春季同时更新父记录和子记录。

我的父实体是这样的:

@Entity(name = "User")
@Table(name = "user")
public class User {
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "UserSequence")
@GenericGenerator(
name = "UserSequence",
strategy = "com.simagdo.test.utils.SequenceIdGenerator",
parameters = {
@Parameter(name = SequenceIdGenerator.INCREMENT_PARAM, value = "1"),
@Parameter(name = SequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "100"),
@Parameter(name = SequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d")
}
)
@Column(name = "Id")
private String id;
@OneToOne(
orphanRemoval = true,
cascade = {
CascadeType.MERGE,
CascadeType.REFRESH
}
)
private Address userAddress;

地址实体看起来像这样(不包括所有列):

@Entity(name = "Address")
@Table(name = "address")
public class Address {
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "AddressSequence")
@GenericGenerator(
name = "AddressSequence",
strategy = "com.simagdo.test.utils.SequenceIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = SequenceIdGenerator.INCREMENT_PARAM, value = "1"),
@org.hibernate.annotations.Parameter(name = SequenceIdGenerator.VALUE_PREFIX_PARAMETER, value = "120"),
@org.hibernate.annotations.Parameter(name = SequenceIdGenerator.NUMBER_FORMAT_PARAMETER, value = "%05d")
}
)
@Column(name = "Id")
private String id;
@Column(
name = "City",
length = 40
)
private String city;
@Column(
name = "Country",
length = 80
)

我想在同一时间更新用户实体和用户的地址。为此,我使用以下代码:

@PutMapping(value = "/updateUser/{id}")
public ResponseEntity<User> updateRecord(@PathVariable(value = "id") String id, @RequestBody User updateUser) {
User user = this.userRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found: " + id));
user.setAnnualRevenue(updateUser.getAnnualRevenue());
user.setBillingAddress(updateUser.getBillingAddress());
user.setDescription(updateUser.getDescription());
user.setEmployees(updateUser.getEmployees());
user.setDeleted(updateUser.isDeleted());
user.setName(updateUser.getName());
user.setPhone(updateUser.getPhone());
user.setShippingAddress(updateUser.getShippingAddress());
user.setType(updateUser.getType());
user.setWebsite(updateUser.getWebsite());
this.userRepository.saveAndFlush(user);
return ResponseEntity.ok().body(user);
}

但是当我发送一个PUT请求时,我得到以下错误:

请求处理失败;嵌套异常是java.lang.RuntimeException: java.lang.StackOverflowError

您可能会返回一个引用Address的User对象,并且该地址也引用了用户类。这就是为什么会出现堆栈溢出错误。我不能保证这一点,因为你没有曝光所有的班级。如果您这样做了,请签出解决方案。

这是一个常见的错误,不要担心。

解决方案:1-在users类上,在Address字段上添加JsonManagedReference注释。

2-在地址类中,在User字段上添加JsonBackReference注释

现在,当你的应用程序将你的User实例转换为Json时,它将添加带有JsonManagedReference注释的字段,并将忽略JsonBackReference字段,并且不会引发堆栈溢出。

最新更新