我目前正在学习 Hibernate,我偶然发现了这个问题:我定义了 3 个实体:用户、模块、权限。user 和 module 都与 Permission 是一对多的关系,所以 Permission 的复合 id 由 idUser 和 idModule 组成。用户类有一个属性,它是一组权限,并用@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 传递给第二个查询?
这种特殊情况对我来说非常违反直觉,因为我倾向于将 null id 传递给 Permission 对象,因为它是新的并且我希望创建它,但另一方面,我必须设置 idModule 属性,因为模块已经存在,所以我真的不明白这样的操作应该如何工作。
有谁知道我做错了什么?谢谢