在尝试更新与子实体具有一对一关系的父实体时,我遇到了 Hibernate 问题。具体来说,我已经为关系配置了 CascadeType.ALL,但是当我更新父实体时,更改不会级联到关联的子实体。
附加信息:
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
这是我配置实体的方式:
@Entity
public class Parent {
@Id
private Long id;
// Other fields and annotations...
@OneToOne(mappedBy = "parent", cascade = CascadeType.ALL)
private Child child;
// Constructors, getters, and setters...
}
@Entity
public class Child {
@Id
private Long id;
// Other fields and annotations...
@OneToOne
@JoinColumn(name = "parent_id")
private Parent parent;
// Constructors, getters, and setters...
}
可能导致此问题的原因是什么,如何确保更新反映到父实体和子实体并正确级联?
任何帮助或建议将不胜感激。谢谢!
期望: 我的期望是,由于两个实体是双向映射的,因此当父实体保存到数据库时,子实体也应自动保存。此外,当使用函数 session.saveOrUpdate(parentEntity) 更新现有行时,父实体和子实体都应相应更新。
分析: session.saveOrUpdate(parentEntity) 上面的函数可以很好地创建具有唯一主键的新行。 但是当我想更新同一主键的现有行中的数据时,它会抛出:
尝试交换拥有方:
@JoinColumn
和@OneToOne(cascade = CascadeType.ALL)
放在父类中的Child字段上方@OneToOne(mappedBy = "child")
放在 Child 类中的 Parent 字段上方您是否使用 ddl-auto 创建数据库结构?你能显示表创建脚本吗?