【问题标题】:JPA relationship entity updated on database but not on siteJPA 关系实体在数据库上更新但不在现场
【发布时间】: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 的身份版本(检查内存中的相同对象),而不是实际比较字段以确定实体是否已经存在。要使持久性提供程序使用字段检查相等性,您需要实现equalshashcode,它们是提供比较逻辑的重写方法。你在用日食吗?我可以引导你完成它。我不能保证它会解决问题,但我认为它很有可能会解决。

标签: java spring jpa orm


【解决方案1】:

尝试使用entityManager 再次查找实体。这应该为实体提供更新的值。

【讨论】:

  • 我不明白。如果我 find() 产品我得到正确的更新值,但我希望 jsp 像往常一样检索它们。我认为我没有理解您的建议
  • 在服务器端findmerge之后的实体。然后将实体添加到请求(或模型,如果使用 Spring MVC)。然后您可以使用表达式语言通过 JSP 访问评级。
  • 我应该只为此创建一个方法,并通过控制器调用它......这似乎有点奇怪。我认为我的代码中还有其他问题
  • @KurtBourbaki 我不知道您的应用程序的结构,但我假设您在示例中发布的方法是由控制器调用的?在该控制器方法中,我将重新获取实体。我可能会错误地假设您的应用程序结构或调用此方法的位置。如果您需要更多帮助,请提供更多背景信息。比如不知道你是怎么把对象发送到jsp显示的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
相关资源
最近更新 更多