2013-09-01 37 views
1

我在JPA中获得了产品和评级实体。JPA关系实体更新了数据库,但未在网站上

在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);但我得到这个错误:

Can not refresh not managed object: [email protected]

我正在困惑,我不知道如何解决这个问题。你可以帮我吗?

+0

所以如果你找到()产品没有更新? –

+0

尝试执行'equals()和hashcode()'并尝试用'find()' –

+0

@KevinBowersox重新获取实体,如果找到()该产品,我会得到正确的值。 “执行equals和hashcode()”意味着什么? –

回答

0

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

+0

我不明白。如果我找到()产品,我会得到正确的更新值,但我希望jsp像往常一样检索它们。我不认为我已经理解你的建议 –

+0

在服务器端'合并'之后'查找'实体。然后将实体添加到请求(或使用Spring MVC的模型)。然后您可以使用表达式语言通过JSP访问评级。 –

+0

我应该只为此创建一个方法,并通过控制器调用它...似乎有点奇怪。我认为我的代码有其他错误 –