2016-04-24 4 views
0

Я пытаюсь удалить запись из нескольких отношений OneToMany, однако независимо от того, что я делаю, она не обновляет коллекцию.Spring JPA OneToMany коллекция не удаляет запись

У меня есть три класса, рейтинг, содержание и пользователь. Я могу успешно создавать рейтинги, которые правильно заполняют контент и пользовательские коллекции. Однако я не могу удалить рейтинги из коллекций. Рейтинг удаляется, но содержимое и пользовательские коллекции не обновляются. Ниже приведены три класса:

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); 
    } 
} 

Даже при удалении вручную из коллекций он по-прежнему не обновляется. Есть идеи?

+0

Я реализовал как хэш-код() и equlas() для всех трех классов, и коллекции все еще не обновляются. (Я использовал генератор IntelliJ с гарантированными уникальными ненулевыми полями) – user3023421

+0

На самом деле рейтинги контента обновляются, но по какой-то причине пользователь этого не делает. Странно, я более подробно рассмотрю, почему – user3023421

+0

Спасибо, Xtreme Biker, который сработал. – user3023421

ответ

1

Это похоже, что у вас нет ни одного подходящего метода hashCode() или equals() для вашего класса Rating. 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(); 
} 

Смотрите также: