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”