我有以下简化模型:
Business - (1:n) - Assignment - (n:1) - Process
模型类有以下注释:
业务
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "business", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Assignment> assignments;
赋值
通常,您将避免在这里创建单独的模型类,因为业务和流程具有n:m关系。但是我需要添加属性来自动分配。
@ManyToOne
@JoinColumn(name = "business_id")
private Business business;
@ManyToOne
@JoinColumn(name = "process_id")
private Process process;
过程
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "process", cascade = CascadeType.ALL)
private List<Assignment> assignments;
要求
提示
orphanRemoval = true
和不使用,但没有得到完全的解决方案。@LazyCollection(LazyCollectionOption.FALSE)
,因为我在业务和流程中有几个@OneToMany
关系,但是这个注释与这个问题无关更新
不幸的是,我认为对以下注释的认可:@OnDelete(action = OnDeleteAction.CASCADE)
和JUnit测试认可了理想行为的正确工作,从而回答了我的问题。
@Test
public void test() {
// stores an Business object in db and returns the saved object
Business b = createBusiness();
// stores an Process object in db and returns the saved object
Process p = createProcess();
// stores Assignmnent object with both relations in db and returns the saved object
Assignment a = createAssignment(b, p);
assertThat(a).isNotNull();
// deletes Process object from db
processService.delete(p);
assertThat(processService.getById(p.getId())).isNull();
assertThat(assignmentService.getById(a.getId())).isNull();
assertThat(businessService.getById(b.getId())).isNotNull();
}
但事实并非如此。在我的JavaFX应用程序中,删除是被记录下来的,它看起来很正常,但是在以后查询数据库时,实体仍然在表中,尽管在JUnit测试中它不是.如果有人能在这个问题上给我一些启示,我将非常感激。
如果需要进一步的资料,我当然会提供。提前谢谢你帮我忙。
发布于 2016-11-10 03:54:22
编辑最终解决了这个问题,并通过以下设置获得了我想要的行为:
业务
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "business", orphanRemoval = true)
@OnDelete(action = OnDeleteAction.CASCADE)
private List<Assignment> assignments;
赋值
@ManyToOne
@JoinColumn(name = "business_id")
private Business business;
@ManyToOne
@JoinColumn(name = "process_id")
private Process process;
过程
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "process", orphanRemoval = true)
@OnDelete(action = OnDeleteAction.CASCADE)
private List<Assignment> assignments;
请注意添加的注释@OnDelete(action = OnDeleteAction.CASCADE)
。这个提示来自here。我在这里省略了Hibernate文档,因为它们(imho)没有提供比链接SO更多的关于该特性的有用信息。
Update:还考虑删除的cascade
属性,这是不必要的,因为我使用的是hibernates @OnDelete
。
https://stackoverflow.com/questions/40522859
复制