场景:
假设我有一个 springboot jpa 应用程序:
public class Home {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long homeId;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "ownerId")
private Owner owner;
// attributes & other methods
}
public class Owner {
private String ownerId; // not auto-generated
// attributes and methods
}
发生的事情是我可以使用我的 springboot 应用程序保存第一个 Home (和所有者,如果不在 mysql 数据库中):
所以类似: homeRepository.save(myhome); // myhome 是一个填充了值的 home 对象
现在的问题是,当我尝试为同一个所有者保存另一个房屋时,它会抛出异常:
org.springframework.dao.DataIntegrityViolationException:无法执行语句[键“owner.PRIMARY”的重复条目“741202”] [插入....
所以它基本上告诉我的是,当尝试保存“新家”时,它看到所有者已经存在并且无法执行插入,因为这将是重复的主要违规。
我在网上搜索了一些关于@manytoone、jpa、双向、更改似乎已弃用的cascade.save_update等解决方法的帮助,但没有运气。
如有任何建议,我们将不胜感激。
我认为应该避免将 CascadeType.ALL 与 @ManyToOne 一起使用,因为将子记录的更改广播到其父记录是没有意义的。您的保存问题也来自 CascaseType.ALL。
我建议您应该禁用级联并通过其自己的存储库类手动执行对“所有者”的更改(如果需要),然后继续“主页”保存操作。