我有2个实体User
和Product
,我也有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.....
答案 0 :(得分:0)
EntityManager.find()从PersistenceContext中检索对象(如果已加载)。您很可能会对对象的缓存版本进行计数。
刷新&#39;产品&#39;数据库中的对象。
em.refresh(product).getStaredUsersCollection().size()
或清除缓存 -
em.clear()
productFacede.find(1).getStaredUsersCollection().size()
我认为分离实体也可能有用 -
em.detach(product)
productFacede.find(1).getStaredUsersCollection().size()