如果我只是添加了一个新的子项java hibernate spring,那么保存父项可以吗?
使用hibernate和JavaSpring,我有两个数据库表,Projects和ProjectNotes。项目可以有很多注释如果我只是添加了一个新的子项java hibernate spring,那么保存父项可以吗?,java,spring,hibernate,Java,Spring,Hibernate,使用hibernate和JavaSpring,我有两个数据库表,Projects和ProjectNotes。项目可以有很多注释 @Entity @Table(name="projects") public class Project { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @OneToMany(mappedBy="project", cascade=Cas
@Entity
@Table(name="projects")
public class Project {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy="project", cascade=CascadeType.ALL)
private List<ProjectNote> projectNotes;
}
它是有效的。这与使用notes存储库有什么不同吗
Project project = projectRepository.findOne(id);
ProjectNote pn = new ProjectNote();
pn.setText("Hello");
pn.setProject(project);
projectNotesRepository.save(pn);
是比另一个更有效还是更正确
编辑:另一个想法。我还在项目中使用@LastModifiedBy/Date。我猜第一种方法会改变项目的lastModified信息,而第二种方法不会。但是我没有试过 在双向映射中,应用程序应保持值同步,这意味着如果调用
bar.setProject(foo)
,则该方法应调用foo.getNotes().add(this)
,使操作对称
如果在Hibernate上启用查询日志记录,您将看到最终结果是相同的。当然,最后修改的日期也将在这两种情况下更新
关于双向关联的复杂性(以及您可能希望避免它们的原因),这里有一些很好的附加考虑事项:我不确定Spring是否会改变情况,但对于JPA来说,一般来说,应用程序负责维护内存中实体之间的双向关系的一致性。你的第一种方法就是这样;你的第二种方法没有。因此,后者本质上是有缺陷的,尽管缺陷是否具有可观察的效果取决于您如何继续使用所涉及的实体当项目的修改日期除了注释外没有任何变化时,触发项目修改日期的更新,因为
ProjectNote
是相关关系的所有者。我想不是。这是需要测试的。事实上,您应该在测试套件中对其进行自动测试。
Project project = projectRepository.findOne(id);
ProjectNote pn = new ProjectNote();
pn.setText("Hello");
pn.setProject(project);
projectNotesRepository.save(pn);