2016-06-21 2 views
0

を保存しますCrudRepositoryを通じて私は問題はありませんが、Permissionテーブルに既に存在するいくつかのPermissionを持つ別のApkPermissionsを保存すると、permissionNameのUnique Key違反を示す例外が発生します。春JPAは、私は2つのエンティティを(私は役に立たないフィールドを削除)を持つ既存のエンティティ@OneToManyの関係

私はこの解決策を見つけた:私の場合を合わせているようだ(と私の現在の実装である)こと

http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/

が、それは動作しません。 MySQLからの

could not execute statement; SQL [n/a]; constraint [UK_l3pmqryh8vgle52647itattb9]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement", 

は、私は、次のエラーメッセージが表示されます

UNIQUE KEY `UK_l3pmqryh8vgle52647itattb9` (`permission_name`) 

一時的な解決策は、リポジトリからpermissionNameで検索すべての対応するパーミッションをretriveです。その後、保存は正常に動作します。 これは論理的に正しいですが、より簡単な手順が存在することを願っています...

+0

例外メッセージの出力を含めることができますか? –

+0

私はそれをしました。 @Pardeepが@Pardeepが提案したように関係を変更したことに注意してください。 –

答えて

0

OneToManyマッピングでは、あなたのアクセス権テーブルにはあなたのApkPermissionsを指す外部キーとなる追加の列が1つあります。例については :

ApkPermission   Permission 
APK_ID | Name   Permission_ID | Name | APK_ID(FK) 
1  | APK1   1   | P1 | 1 
         2   | P2 | 1 

だから、あなたが他のApkPermissionレコードから同じ権限を指すことはできません。あなたが2 | ApkPermissionでAPK2を呼び出し、P1とP2を再度指しておきたい。パーミッションテーブルにP1とP2のエントリを再度作成しない限り、1対多の関係でそれを行うことはできません。それは重複を作成します。したがって、ここには2つのオプションがあります。一意制約を削除するか(permissionNameで)、またはマッピングをManyToManyに変更します。

+0

正しいことはManyToMany ... ですが、既にdbに存在するdeclaredPermissionsにPermissionを持つApkPermissionを保存しても問題は解決しません。 –

+0

manyToManyで試しましたか?その場合、もう1つテーブルを追加する必要があります。新しいエントリは新しい結合テーブルに入れられます。利用可能な例がたくさんあります。OneToManyでは、新しいレコードを挿入する必要があります。さもなければ、それは意味をなさないでしょう。 –

+0

まだOneToMany(&正規化されていない)を続行したい場合は、重複を持つようにpermissionNameから一意制約を削除できます。 ManyToManyで試してみることをお勧めします。主キーがnullの場合、hibernate saveは常に挿入クエリを作成することを言いたいと思います。その場合は、saveOrUpdateを使用してください。しかし、あなたのレコードがDBにあれば、それを保持しようとするとIDはnullにならず、そうでなければ新しいレコードとみなされます。 –

関連する問題