Spring JPA OneToMany 集合不删除条目

Posted

技术标签:

【中文标题】Spring JPA OneToMany 集合不删除条目【英文标题】:Spring JPA OneToMany collection not deleting entry 【发布时间】:2016-08-17 23:02:27 【问题描述】:

我正在尝试从多个 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);
     

即使手动从集合中删除它仍然不会更新。有什么想法吗?

【问题讨论】:

我为所有三个类都实现了 hashCode() 和 equlas() 并且集合仍然没有更新。 (我使用了 IntelliJ 生成器,保证了唯一的非空字段) 实际上内容的评级正在更新,但由于某种原因用户的评级并未更新。奇怪,我会仔细看看为什么 谢谢 Xtreme Biker,它成功了。 当然,如果你也想要 【参考方案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();

另请参阅:

https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html

【讨论】:

以上是关于Spring JPA OneToMany 集合不删除条目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot JPA 中的 OneToMany 中为孩子获取 Null 值

是否可以使用 Hibernate 或 JPA Annotations 限制 @OneToMany 集合的大小?

JPA、Spring、Hibernate 加载实体 OneToMany 关联的问题

Spring数据休息和jpa @OneToMany重复“_links”

使用 JPA 的 Spring Boot OnetoMany

Spring JPA - @OneToMany 为每个关系创建单独的表