2016-04-24 16 views
0

Ich versuche, einen Eintrag aus mehreren OneToMany-Beziehungen zu löschen, aber egal, was ich tue, aktualisiert es die Sammlung nicht.Spring JPA OneToMany Sammlung nicht Eintrag löschen

Ich habe drei Klassen, Bewertung, Inhalt und Benutzer. Ich kann erfolgreich Bewertungen erstellen, die den Inhalt und die Benutzersammlungen ordnungsgemäß ausfüllen. Ich kann jedoch Bewertungen aus den Sammlungen nicht löschen. Die Bewertung wird erfolgreich gelöscht, die Inhalte und Benutzersammlungen werden jedoch nicht aktualisiert. Im Folgenden sind die drei Klassen:

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

Selbst wenn manuell aus den Sammlungen zu entfernen es noch nicht aktualisiert. Irgendwelche Ideen?

+0

ich beide hashCode() implementiert und equlas() für alle drei Klassen und die Sammlungen werden immer noch nicht aktualisiert. (Ich verwendete IntelliJ-Generator mit garantierten eindeutigen Nicht-Null-Feldern) – user3023421

+0

Tatsächlich werden die Bewertungen des Inhalts aktualisiert, aber aus irgendeinem Grund ist der Benutzer nicht. Seltsam, ich werde einen genaueren Blick darauf werfen, warum – user3023421

+0

Danke Xtreme Biker, das hat funktioniert. – user3023421

Antwort

1

Das sieht irgendwie gut aus, dass Sie weder eine geeignete hashCode() noch equals() Methode für Ihre Rating Klasse haben. Java kann den zu löschenden nicht finden und wird daher nicht entfernt.

Sie könnten eine EntityBase schreiben, aus dem alle Klassen werden diese gemeinsamen Code haben:

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

Siehe auch:

Verwandte Themen