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

时间:2016-03-29 02:13:45

标签: hibernate jpa

我在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;

当我选择两个PersonAttributes值和两个PersonRoles值并保持实体时,在从数据库中读取它时,值会交叉乘法。

示例:

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

另一个例子:

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

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

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

1 个答案:

答案 0 :(得分:1)

请看这个答案@OneToMany List<> vs Set<> difference

您无法在实体中检索多个Observable<List<A>> getAFromServer(); Observable<List<B>> getBFromServer(@Body A.a); 。如果您想为您的实体添加多个List<A> listA = getAFromServer(); foreach(A a: listA){ getBFromServer(a.a) } ,请使用 java.util.List 而不是java.util.Set