我有两个对象,父母和孩子。孩子有一个外国密钥 返回 PARENT_ID 字段的 PARENT 表格( MySQL 数据库) 。
当父母和子女对象同时创建/组合并持续使用时,儿童 PARENT_ID 外国密钥不会自动被覆盖。
样本代码 :
@Entity
@Table(name = "PARENT")
public class Parent {
@Column(name = "PARENT_ID")
private Long parentId;
@OneToMany(mappedBy = "parent")
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child {
@Column(name = "CHILD_ID")
private Long childId;
@Column(name = "PARENT_ID")
private Long parentId;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
我有两种持久性的样本:
1) 使用休眠实体管理器:
@PersistenceContext
EntityManager em;
...
em.persist(parent);
2) 使用 Spring Data JPA JpaRepository 实例:
public interface ParentRepository extends JpaRepository<Parent, Long> {
}
在我的父母服务问题中:
@Autowired
private ParentRepository parentRepository;
...
public Parent save(Parent parent) {
return parentRepository.save(parent);
}
建议的外国密钥弹出策略是什么? 父密钥是否先是持续,然后是孩子反对在那个时候设定的外国密钥? 还是有办法同时自动设定外国密钥或参照该外国密钥?
编辑:增加了持久性样本。
Edit 2 (fixed! ) : 根据 Ryan Stewart 的第二点解决了问题 。 我从儿童对象中移除了长父字段, 并在获取器上放置了 parentId 的@ Column 引用 。 还要确保设置正确的引用( 主要是孩子引用回到父母) 。 strong >