我正在学习Hibernate,我偶然发现了这个问题: 我已经定义了3个实体:用户,模块,权限。用户和模块都与Permission具有一对多关系,因此Permission的复合ID由idUser和idModule组成。用户类具有一组Permission属性,并使用@OneToMany,cascade = CascadeType.ALL等进行适当注释。
现在,我使用MyEclipse的逆向工程功能生成了类。权限id是作为具有idUser和idModule属性的单独类创建的。我以为我可以创建一个用户,为它添加一些新的权限,从而保存用户级联操作,并自动保存权限。这是正确的,除了操作导致异常。我运行以下代码:
Permission p = new Permission();
p.setId(new PermissionId(null, module.getId());
user.getPermissions().add(p);
session.save(user);
我遇到的问题是,即使正确生成SQL(首先保存用户,然后保存权限),我从数据库驱动程序(Firebird)收到一个错误,指出它无法插入空值idUser,这是真的,但是不应该将新创建的用户ID传递给第二个查询?
这个特殊情况对我来说非常反直觉,因为我倾向于将空id传递给Permission对象,因为它是新的并且我希望它被创建,但另一方面,我必须设置idModule由于模块已经存在,因此我并不真正理解这样的操作应该如何工作。
有谁知道我做错了什么?感谢
答案 0 :(得分:0)
当您保存带有附加瞬态的User
(意味着尚未保存)Permission
时,您需要为Hibernate指定cascade action。
顺便说一下,您可能要考虑为Permission
对象使用不同的ID策略,例如生成的ID值 - 数据库中permission
行的主键如何包含空值?