【发布时间】:2013-09-01 15:49:59
【问题描述】:
我在 JPA 中有 Product 和 Rating 实体。
在 Product.java 中:
@OneToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="rating_id")
@JsonManagedReference("product-rating")
private Rating rating;
在 Rating.java 中:
@OneToOne(mappedBy="rating",cascade=CascadeType.MERGE)
@JsonBackReference("product-rating")
private Product product;
在我的 JPAService 实现中:
@Override
@Transactional
public void updateCartLineRating(CartLine cartLine, int rating) {
cartLine.setRating(rating);
em.merge(cartLine);
Product product = cartLine.getProduct();
Rating productRatingObject = product.getRating();
// Here I calculate new rating, then I set it:
productRatingObject.setRating(productRating);
// I associate the new Rating to Product (which is the relationship owner) and viceversa
productRatingObject.setProduct(product);
product.setRating(productRatingObject);
em.merge(product);
}
当我这样做时,我的数据库会更新,而我的视图不会。我必须重新启动服务器才能显示这些更改。
我试图在em.merge(product); 之后写em.refresh(product);,但我得到了这个错误:
无法刷新非托管对象:package.Product@33891d5d
我很困惑,我不知道如何解决这个问题。你能帮帮我吗?
【问题讨论】:
-
如果您
find()产品没有更新? -
尝试实现
equals() and hashcode()并尝试使用find()重新获取实体 -
@KevinBowersox 如果我找到()产品,我会得到正确的值。 “实现equals和hashcode()”是什么意思?
-
持久性提供者可能依赖于 Java 的身份版本(检查内存中的相同对象),而不是实际比较字段以确定实体是否已经存在。要使持久性提供程序使用字段检查相等性,您需要实现
equals和hashcode,它们是提供比较逻辑的重写方法。你在用日食吗?我可以引导你完成它。我不能保证它会解决问题,但我认为它很有可能会解决。