Java Hibernate-在自动删除带有注释的父对象时删除子对象
我有两个实体,Java Hibernate-在自动删除带有注释的父对象时删除子对象,java,sql,hibernate,one-to-many,hibernate-mapping,Java,Sql,Hibernate,One To Many,Hibernate Mapping,我有两个实体,Group,它有Users,意思是parent实体: @Entity @Table(name = "groups") public class Group implements Serializable{ //Some other content @OneToMany(fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL, orphanRemoval = true) private L
Group
,它有User
s,意思是parent
实体:
@Entity
@Table(name = "groups")
public class Group implements Serializable{
//Some other content
@OneToMany(fetch = FetchType.LAZY, mappedBy = "group",
cascade = CascadeType.ALL, orphanRemoval = true)
private List<User> users;
}
这个想法是当组
被删除时,所有相关的用户
也应该被删除。我用内存数据库创建了一个单元测试,它显示了我的意思:
@Test
public void test_WhenGroupIsRemoved_RelatedUsersAlsoShouldBeRemoved() throws Exception{
service.save(new GroupDTO(null, "Group", (long)47));
List<GroupDTO> groups = service.getAll();
assertEquals(1, groups.size());
GroupDTO groupDTO = groups.get(0);
userService.save(new UserDTO(null, "testName", "testSurname", "testEmail", "333", groupDTO));
userService.save(new UserDTO(null, "testName2", "testSurname2", "testEmail2", "333-2", groupDTO));
service.delete(groupDTO);
List<GroupDTO> emptyGroups = service.getAll();
assertEquals(0, emptyGroups.size());
List<UserDTO> emptyUsers = userService.getAll(new UserFilterParameters());
assertEquals(0, emptyUsers.size());
}
在Hibernate之前:从id=?
的组中删除,我认为应该删除User
s,我认为这可以自动完成-使用适当的注释
,但我无法理解。如果我从@OneToMany
侧删除mappedBy=“group”
,并添加@JoinColumn
(组
实体),并将@JoinColumn(insertable=false,updateable=false)
添加到@ManyToOne
侧(用户
实体),就像我在类似问题中发现的那样,我看到一些奇怪的错误:完整性约束冲突:非空检查约束;SYS\U CT\U 10101表格:用户列:组ID
。
如果有人决定帮助我,我会非常高兴的——提前谢谢你!
更新服务:
@Service
public class GroupServiceImpl implements GroupService {
@Autowired
private GroupDAO groupDAO;
@Autowired
private GroupTransformer groupTransformer;
@Override
@Transactional
public void delete(GroupDTO groupDTO) {
groupDAO.delete(groupTransformer.dtoToEntity(groupDTO));
}
还有一个错误:在groupTransformer
中,转换很简单,返回新组(…)
。但它应该是:
@Override
public Group dtoToEntity(GroupDTO groupDTO) {
return groupDTO.getId() != null? dao.getById(groupDTO.getId()) : new Group(groupDTO.getId(), groupDTO.getName());
}
当DTO有Id时,应该使用DAO来获取
组
(这意味着它存在于数据库中)。感谢用户@JB Nizet我相信有一个cascade
变量,您可以在@ManyToOne
注释中设置为类似cascade.ALL的内容。不过,别相信我的话。服务是如何实现的?@JB Nizetservice
(更准确地说,Transformer
)的实现方式很糟糕。非常感谢,你的回答告诉了我正确的方法:)
@Service
public class GroupServiceImpl implements GroupService {
@Autowired
private GroupDAO groupDAO;
@Autowired
private GroupTransformer groupTransformer;
@Override
@Transactional
public void delete(GroupDTO groupDTO) {
groupDAO.delete(groupTransformer.dtoToEntity(groupDTO));
}
@Override
public Group dtoToEntity(GroupDTO groupDTO) {
return groupDTO.getId() != null? dao.getById(groupDTO.getId()) : new Group(groupDTO.getId(), groupDTO.getName());
}