JPA Hibernate枚举很多

时间:2016-07-13 20:14:58

标签: spring hibernate jpa

我正在尝试创建2个用户实体,因为我的应用程序正在启动,其中有一个Role字段,它是一个枚举集合。其中一个用户有两个角色,另一个有一个角色。枚举没有相应的表,但有一个名为USER_AUTHORITY_ROLES的连接表。这两个用户是在两个不同的spring bean中创建的。 User类中的字段如下所示

@OrderColumn
    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    private List<AuthorityRole> authorityRoles = new ArrayList<AuthorityRole>();

当我创建一个用户时,它工作正常,但是当我创建2个用户时,hibernate只为USER_AUTHORITY_ROLES表中的每个用户保存一个条目,具有相同的角色。
我创建了一个像这样的用户角色

user.setAuthorityRoles(Arrays.asList(AuthorityRole.ROLE_ADMIN, AuthorityRole.ROLE_USER));

如果我尝试使用Arrays.asList hibernate创建其他用户的角色抱怨该集合是不可修改的。

Caused by: java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(AbstractList.java:161) ~[?:1.8.0_31]
    at java.util.AbstractList$Itr.remove(AbstractList.java:374) ~[?:1.8.0_31]
    at java.util.AbstractList.removeRange(AbstractList.java:571) ~[?:1.8.0_31]
    at java.util.AbstractList.clear(AbstractList.java:234) ~[?:1.8.0_31]
    at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:543) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.type.CollectionType.replace(CollectionType.java:697) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:193) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:407) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:219) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:192) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:85) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:876) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:858) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:863) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1196) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]

似乎hibernate只允许我为每个用户分配一个角色(同一个角色)。为什么会这样呢?

更新 当两个集合都使用ArrayList时,我遇到了同样的问题。在连接表中,只有2个角色的用户只有一个。

1 个答案:

答案 0 :(得分:0)

这是因为你的

UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

创建一个不可修改的列表。 Hibernate期望一个可修改的列表。尝试使用它,看看你是否可以添加2个角色:

user.setAuthorityRoles(Arrays.asList(AuthorityRole.ROLE_ADMIN, AuthorityRole.ROLE_USER));

如果没有检查你是否在DB中的表之间没有创建任何额外的关系,或者你在模型中的某个地方指定了级联。