2017-09-15 5 views
0

コントローラでは、ユーザ間の "友情"を削除するサービスメソッドを呼び出します。ファシリティを削除するときにHibernateが新しいものを追加する

// Remove friendship 
    friendshipService.removeFriendship(friendship); 

これは予期せず方法

@Override 
public void removeFriendship(Friendship friendship) { 
    Long fromId = friendship.getFromId(); 
    Long toId = friendship.getToId(); 

    friendshipRepository.delete(new Friendship(fromId, toId)); 
    friendshipRepository.delete(new Friendship(toId, fromId)); 
} 

のボディは、データベースとHibernateのコマンドは、新しいオブジェクトを追加なぜ、この

Hibernate: select nextval ('hibernate_sequence') 
Hibernate: insert into friendship (from_id, to_id, id) values (?, ?, ?) 
Hibernate: delete from friendship where id=? 
Hibernate: select nextval ('hibernate_sequence') 
Hibernate: insert into friendship (from_id, to_id, id) values (?, ?, ?) 
Hibernate: delete from friendship where id=? 

のように見えるのですか?

+0

あなたの 'FriendshipRepository'を表示してください。また、「友情」がちょうど2つのid-sである場合、私はあなたが複数のことを間違っていることを嗅ぐことができます。 Hibernateの関係はid-s間ではなく、それらはエンティティ間にあります。また、単純な関係であれば、別のエンティティではなく、エンティティクラスとそれ自身の間の多対多であるべきです。 – Tobb

答えて

0

私はそれがnew Friendship(...,...)のためだと思います。新しいオブジェクトを作成して削除するようにJPAに指示しています。 JPAは単一のトランザクションスコープであるため、新しい友人関係がまだ管理されているので、JPAはそれを維持します。 A good SO question about managed vs unmanaged。友情は二人のユーザーをリンクされている場合は、単にそれらのユーザーが自分の友達リストのみuser.getFriendshipList();更新

JPAを持っていることを確認し、

@Override 
public void removeFriendship(Friendship friendship) { 
    friendshipRepository.delete(friendship); 
} 

を持っていないのはなぜ

エンティティの削除

管理対象を削除する

エンティティを削除するときはyour transaction scopeに注意してください。私はなぜFriendship(fromId, toId) != Friendship(toId, fromId)かしら、friendshipRepository.delete(Friendship friendship)の後ろに、あなたは友情の定義

JPAの削除とは無関係の


@Override public void removeFriendship(Friendship friendship) { Friendship managedFriendship = entityManager.getReference(Friendship.class, friendship.getId()); friendshipRepository.delete(managedFriendship); } 

entityManager.remove(friendship);のようなものを持っていることを前提としています。友情が2人のユーザー間のリンクである場合、関係は対称でなければなりません

関連する問題