2016-07-13 11 views
0

私は2つのユーザエンティティを作成しようとしています。アプリケーションが起動しているときに、enumのコレクションであるRoleフィールドを持っています。ユーザーの1人に2つの役割があり、もう1つには1つの役割があります。列挙型には対応する表がありませんが、USER_AUTHORITY_ROLESという結合表があります。 2人のユーザーは、2つの異なる春の豆で作成されます。私はちょうどそれが正常に動作します一人のユーザーを作成すると、Userクラス内のフィールドは、私は2人のみUSER_AUTHORITY_ROLESテーブル内のユーザーごとに1つのエントリ、同じ役割を節約休止作成しかしとき、このJPA Hibernate enum many to many

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

のように見えます。
私はArrays.asList休止、そのコレクションが変更不可能であることについて文句を使用して、他のユーザーのロールを作成しようとすると、私はこの

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

のようなユーザーの役割のいずれかを作成します。

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は私だけが、各ユーザに割り当てられた1つの役割(同じ役割を)持っているようになるように思えます。なぜこれが当てはまるのでしょうか?

更新:両方のコレクションがArrayListで作られていた場合 私は同じ問題を抱えています。ジョイン・テーブルでは、2つのロールしか持たないユーザには1つしかありません。

+0

私はちょっと混乱していると認めますが、問題はArrays.toList()が変更不可能なリストを返すことです。ロールリストを手動でArrayListとして作成して、それがうまく機能するかどうかを確認してください。 – stdunbar

+0

1つのロールを持つユーザーのリストをArrayListとして作成すると、例外はスローされませんが、Arrays.toListを使用してそのリストを作成していても、2つのロールを持つユーザーから1つのロールが削除されます。 – gary69

答えて

0

あなた

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

の変更不可能なリストを作成するためです。 Hibernateは変更可能なリストを期待しています。代わりにこれを使用してみてください、あなたは2つの役割を追加できるかどうかを確認:あなたはDB内のテーブル間の任意の追加の関係を作成did'tたり、モデルのどこかにカスケードを指定した場合はチェックしない場合は

List<AuthorityRole> list = new ArrayList<AuthorityRole>(); 
list.add(AuthorityRole.ROLE_ADMIN); 
list.add(AuthorityRole.ROLE_USER);  
user.setAuthorityRoles(list); 

を。

+0

Hibernate両方のリストが変更不可能な場合にのみ、変更不可能なリストについて不平を言う。このリストは、対応するテーブルを持たないenumで構成されています – gary69