JPA很多很多级联不起作用

时间:2016-06-05 15:39:48

标签: java jpa

我有2个实体UserProduct,我也有Star关系。用户可以用星标标记许多产品,产品可以被很多用户标记。

我有实体:

@Entity
@Table(name = "USERS")
@XmlRootElement
public class User implements Serializable {

    @JoinTable(name = "STARED", joinColumns = {
        @JoinColumn(name = "BUYER_ID", referencedColumnName = "ID")}, inverseJoinColumns = {
        @JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID")})
    @ManyToMany(cascade = CascadeType.ALL)
    private Collection<Product> staredProductsCollection;

    // More fields........
}

@Entity
@Table(name = "PRODUCTS")
@XmlRootElement
public class Product implements Serializable {

    @ManyToMany(mappedBy = "staredProductsCollection")
    private Collection<User> staredUsersCollection;

    // More fields.......
}

因此用户是所有者。但是当我尝试更新明星名单时:

User user = userFacade.find(1);
Product product = productFacade.find(1);
user.getStaredProductsCollection().add(product);
userFacade.edit(user);
productFacede.find(1).getStaredUsersCollection().size() // Stays 0.....

edit方法是

public void edit(User user) {
    em.merge(user);
    em.flush();
}

为什么即使用户有staredUsersCollection注释,产品的CascadeType.ALL也不会更新?现在我必须重新启动服务器才能看到更改。那我怎样才能让它更新?

修改
感谢ujulu,对插入的修复是:

User user = userFacade.find(1);
Product product = productFacade.find(1);
user.getStaredProductsCollection().add(product);
product.getStaredUsersCollection().add(user);
userFacade.edit(user);
productFacede.find(1).getStaredUsersCollection().size() // Now it 1!!

但现在删除不起作用:

User user = userFacade.find(1);
Product product = productFacade.find(1);
user.getStaredProductsCollection().remove(product); // Returns true
product.getStaredUsersCollection().remove(user); // Returns true
userFacade.edit(user);
productFacede.find(1).getStaredUsersCollection().size() // Stay on 1.....

1 个答案:

答案 0 :(得分:0)

EntityManager.find()从PersistenceContext中检索对象(如果已加载)。您很可能会对对象的缓存版本进行计数。

EntityManager.find()

刷新&#39;产品&#39;数据库中的对象。

em.refresh(product).getStaredUsersCollection().size()

或清除缓存 -

em.clear()
productFacede.find(1).getStaredUsersCollection().size()

我认为分离实体也可能有用 -

em.detach(product)
productFacede.find(1).getStaredUsersCollection().size()