Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
包含两个枚举的实体,但Hibernate会将持久值相乘_Hibernate_Jpa - Fatal编程技术网

包含两个枚举的实体,但Hibernate会将持久值相乘

包含两个枚举的实体,但Hibernate会将持久值相乘,hibernate,jpa,Hibernate,Jpa,我在Hibernate托管实体中有以下两个字段: @ElementCollection(targetClass = PersonAttributes.class, fetch = FetchType.EAGER) @Enumerated(EnumType.STRING) @CollectionTable(name = "PERSON_ATTRIBUTES", joinColumns = { @JoinColumn(name = "PERSON_ID") }) @Column(name = "AT

我在Hibernate托管实体中有以下两个字段:

@ElementCollection(targetClass = PersonAttributes.class, fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "PERSON_ATTRIBUTES", joinColumns = { @JoinColumn(name = "PERSON_ID") })
@Column(name = "ATTRIBUTES")
private List<PersonAttributes> attributes;

@ElementCollection(targetClass = PersonRoles.class, fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "PERSON_ROLES", joinColumns = { @JoinColumn(name = "PERSON_ID") })
@Column(name = "ROLES")
private List<PersonRoles> roles;
@ElementCollection(targetClass=PersonAttributes.class,fetch=FetchType.EAGER)
@枚举(EnumType.STRING)
@CollectionTable(name=“PERSON\u ATTRIBUTES”,joinColumns={@JoinColumn(name=“PERSON\u ID”)})
@列(name=“ATTRIBUTES”)
私有列表属性;
@ElementCollection(targetClass=PersonRoles.class,fetch=FetchType.EAGER)
@枚举(EnumType.STRING)
@CollectionTable(name=“PERSON\u ROLES”,joinColumns={@JoinColumn(name=“PERSON\u ID”)})
@列(name=“ROLES”)
私有列表角色;
当我选择两个
PersonAttributes
值和两个
PersonRoles
值并持久化实体时,从数据库中读取时,这些值会被交叉乘以

例如:

持续角色=
[管理员,主管]
和属性=
[属性1,属性2]
。从数据库读取实体时,我得到角色=
[ADMIN,SUPERVISOR,ADMIN,SUPERVISOR]
和属性=
[ATTRIBUTE1,ATTRIBUTE1,ATTRIBUTE2,ATTRIBUTE2]

另一个例子:

持久化角色=
[ADMIN]
和属性=
[ATTRIBUTE1,ATTRIBUTE2]
。 从数据库中读取实体时,我得到roles=
[ADMIN,ADMIN]
和attributes=
[ATTRIBUTE1,ATTRIBUTE2]

看起来有一些意外的加入?在没有交叉乘法的情况下,如何让Hibernate读取持久化枚举


附加信息:当我使用
entityManager.find()方法时会发生这种情况。但是当我通过JPQL SELECT语句获得所有实体作为列表时,枚举是合适的。

请看这个答案


在实体中不能检索多个
java.util.List
。如果要将多个
集合
附加到实体,请使用
java.util.Set
而不是
列表

在JPA中,类可以有多个列表字段。JPA用于持久化users类,而不是对用户可以或不能拥有的字段施加任意限制。该链接表示Hibernate不能在一次调用中检索多个列表。这里的关键词是检索不使用Neil,你说得对,我错误地表达了这种情况。我已经更改了答案。好的,但这并不能解决用户问题。Hibernate不能在一个SQL中可靠地检索两个列表,这并不意味着Hibernate应该尝试在一个SQL中检索两个列表。如果它知道它不能这样做,那么它应该在2条SQL语句中检索。用户应始终获取他们已持久化的数据。如果他们没有,那就是一个休眠错误。是冬眠虫吗?是的,是个虫子。此错误在Hibernate 5中修复。让我在Hibernate tracker中找到问题..已修复。还有一些解决方法:>可以通过以下方法解决此问题:>将OneToMany关系从列表更改为集合>仅使用级联合并或持久化,而不是全部使用>通过添加到“0”索引(a.getBs.Add(0,new B())向a.getBs添加一个新的B,因此请查看持久化的内容以及为持久化它而调用的SQL,然后查看为检索字段而调用的SQL。