2016-04-24 11 views
0

複数のOneToMany関係からエントリを削除しようとしていますが、何をしてもコレクションを更新しません。Spring JPA OneToManyコレクションのエントリを削除しない

評価、コンテンツ、ユーザーの3つのクラスがあります。私は、コンテンツとユーザーコレクションを正しく埋め込む評価を作成することができます。ただし、コレクションから評価を削除することはできません。レーティングは正常に削除されますが、コンテンツとユーザーのコレクションは更新されません。手動で、それはまだ更新されていないコレクションから削除した場合でも

public class Rating { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JsonIdentityInfo(generator = JSOGGenerator.class) 
    private User user; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JsonIdentityInfo(generator = JSOGGenerator.class) 
    private Content content; 

    public void setUser(User user) { 
     this.user = user; 
     if (!user.getRatings().contains(this)) { 
      user.getRatings().add(this); 
     } 
    } 

    public void setContent(Content content) { 
     this.content = content; 
     if (!content.getRatings().contains(this)) { 
      content.getRatings().add(this); 
     } 
    } 
} 

public class User { 
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JsonIdentityInfo(generator = JSOGGenerator.class) 
    private Set<Rating> ratings; 

    public void addRating(Rating rating) { 
     this.ratings.add(rating); 
     if (rating.getUser() != this) { 
      rating.setUser(this); 
     } 
    } 

    public void removeRating(Rating rating) { 
     ratings.remove(rating); 
    } 
} 

public class Content { 
    @OneToMany(mappedBy = "content", cascade = CascadeType.ALL, orphanRemoval = true) 
    @JsonIdentityInfo(generator = JSOGGenerator.class) 
    private Set<Rating> ratings; 

    public void addRating(Rating rating) { 
     this.ratings.add(rating); 
     if (rating.getContent() != this) { 
      rating.setContent(this); 
     } 
    } 

    public void removeRating(Rating rating) { 
     ratings.remove(rating); 
    } 
} 

public class RatingController { 
    @RequestMapping(value = "/api/ratings/{id}", method = RequestMethod.DELETE) 
    public void deleteRating(@PathVariable("id") int ratingId) { 
     Rating rating = ratingService.getRatingById(ratingId); 

     if (rating == null) { 
      return; 
     } 

     // THIS DOES NOT DO ANYTHING 
     rating.getUser().removeRating(rating); 

     // THIS DOES NOT DO ANYTHING 
     rating.getContent().removeRating(rating); 

     ratingService.deleteRating(rating); 
    } 
} 

:次の3つのクラスです。何か案は?

+0

を私は(両方のhashCodeを実装) 3つのクラスすべてに対してequlas()を呼び出すと、コレクションはまだ更新されません。 (私は保証されたユニークな非ヌルフィールドでIntelliJジェネレータを使用しました) – user3023421

+0

実際にはコンテンツのレーティングが更新されていますが、何らかの理由でユーザがそうではありません。奇妙な、なぜ私は詳細を調べるでしょう – user3023421

+0

Xtremeバイカー、ありがとう、ありがとう。 – user3023421

答えて

1

あなたのRatingクラスには、適切なhashCode()またはequals()メソッドがありません。 Javaは削除したいものを見つけることができないため、削除されません。

あなたは、すべてのクラスは、この共通のコードを持っています、そこからEntityBaseを書くことができます:

@Override 
public boolean equals(Object obj) { 
    if (obj == null || !this.getClass().equals(obj.getClass())) { 
     return false; 
    } 
    return ComparisonChain.start().compare(getId(), ((EntityBase) obj).getId()).result() == 0; 
} 

@Override 
public int hashCode() { 
    return (getId() == null) ? super.hashCode() : getId().intValue(); 
} 

も参照してください:

関連する問題