Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠级联&x2B;复合id';问题_Java_Database_Hibernate_Firebird_Myeclipse - Fatal编程技术网

Java 休眠级联&x2B;复合id';问题

Java 休眠级联&x2B;复合id';问题,java,database,hibernate,firebird,myeclipse,Java,Database,Hibernate,Firebird,Myeclipse,我目前正在学习Hibernate,我偶然发现了这个问题: 我定义了3个实体:用户、模块、权限。用户和模块都与权限有一对多的关系,因此权限的复合id由idUser和idModule组成。用户类有一个属性,该属性是一组权限,并使用@OneToMany、cascade=CascadeType.ALL等进行了适当的注释 现在,我用MyEclipse的反向工程特性生成了这些类。权限的id是作为具有idUser和idModule属性的单独类创建的。我认为我可以创建一个用户,向其添加一些新的权限,这样保存用户

我目前正在学习Hibernate,我偶然发现了这个问题: 我定义了3个实体:用户、模块、权限。用户和模块都与权限有一对多的关系,因此权限的复合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传递给第二个查询吗

这个特定的场景对我来说非常不直观,因为我倾向于向权限对象传递一个空id,因为它是新的,我希望创建它,但另一方面,我必须设置idModule属性,因为模块已经存在,所以我不太理解这样的操作应该如何工作

有人知道我做错了什么吗?谢谢

当您使用附加的瞬态(表示尚未保存)
权限保存
用户
时,您需要为Hibernate指定要执行的操作


顺便说一下,您可能想考虑对<代码>权限对象使用不同的ID策略,例如生成的ID值。数据库中的<代码>许可证< /代码>行的主键如何包含空值?

谢谢。但不是层叠的。所有的动作都有效吗?权限对象不能有空值。问题是我必须将它的idUser属性设置为null,因为用户还没有创建。我认为,一旦用户对象被持久化,级联操作将把这个值传递给权限对象。正如我所说,该操作正在生成两个查询(插入用户,插入权限)。只是插入权限的部分无权访问新创建的用户id。如果要生成权限id,则不应将其设置为非空值。Hibernate需要知道它是否应该为实体生成ID——默认的方法是使用未保存的null值作为ID——请参阅本部分。但请注意,它指的是使用复合ID执行此操作的困难。最后,我建议使用生成的值(如autoincrement)用于权限ID,而不是权限。问题是,在这种情况下,由于ID是复合的,所以ID的一部分是新的(用户ID),另一部分不是(模块ID来自已存在的模块对象)。因此,我必须至少手动设置id的模块部分,否则它将无法正确链接到模块实体。但是,如果我理解正确,我必须将整个id属性保留为null,否则它将无法工作?谢谢,手册的这一部分没有说明如何使用复合id来完成它。我开始认为这在这个场景中根本不受支持。我想我将手动插入权限对象。