java - Spring JPA OneToMany 集合不删除条目

标签 java spring hibernate 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);
    } 
}

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

最佳答案

看起来您的 Rating 类没有合适的 hashCode()equals() 方法。 Java 找不到您要删除的内容,因此它不会被删除。

您可以编写一个EntityBase,其中所有类都将具有以下公共(public)代码:

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

另请参阅:

关于java - Spring JPA OneToMany 集合不删除条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36825596/

相关文章:

java - Hibernate 无法解析属性

java - 查询我的 JPA 提供程序 (Hibernate) 以获取实体的 <Id,Name> 集合

java - sqlite:查找或替换

java - Primefaces 日历 - 未显示正确的日期

java - 没有为带有 Comparator<Map.Entry 的 TreeMap 找到合适的构造函数

java - Eclipse 将无法启动

java - 您对 Spring MVC 应用程序中的服务层使用什么命名约定?

java - 如何在 'main' 线程上运行 DefaultMessageListenerContainer

spring - 向所有传出 CXF 请求添加 header

mysql - mysql中有没有像oracle connect by这样的分层查询关键字