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 Nizet
service
(更准确地说,
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());
}