【发布时间】:2011-10-18 15:32:23
【问题描述】:
我目前正在学习 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,这是真的,但hibernate不应该将新创建的用户id传递给第二个查询吗?
这个特殊场景对我来说感觉非常违反直觉,因为我倾向于将 null id 传递给 Permission 对象,因为它是新的并且我希望创建它,但另一方面,我必须设置 idModule属性,因为模块已经存在,所以我真的不明白这样的操作应该如何工作。
有谁知道我做错了什么?谢谢
【问题讨论】:
标签: java database hibernate firebird myeclipse