我尝试使用shoppingcart
创建一个由cartitem
和playframework
组成的网络应用。我创建了以下映射,当我尝试运行webapp时,我发现{{创建的表没有值,这会创建双向关联。
postgres db
当我将cartitem添加到购物车时,
@Entity
public class CartItem extends Model implements Comparable<CartItem>
@OneToOne
public Product pdt;
@ManyToOne
public ShoppingCart cart;
public int quantity;
...
}
@Entity
public class ShoppingCart extends Model {
@OneToOne
public MyUser customer;
@OneToMany(mappedBy="cart", cascade=CascadeType.ALL)
public Set<CartItem> cartItems;
public ShoppingCart(MyUser customer) {
super();
this.customer = customer;
this.cartItems = new TreeSet<CartItem>();
}
...
}
在post期间执行此方法时,println()语句生成
public static void addItemToCart(Long productId,Long cartId,String quantity) {
Product pdt = Product.findById(productId);
ShoppingCart cart = ShoppingCart.findById(cartId);
int qty = Integer.parseInt(quantity);
System.out.println("create cartitem from "+qty +" copies of product="+pdt.getName()+" for user="+cart.getCustomer().getEmail());
CartItem cartItem = new CartItem(pdt,qty);
cart.addItem(cartItem);
cart.save();
redirect("/");
}
创建的表显示了此数据
create cartitem from 3 copies of product=Product1 for user=jon@gmail.com
cart_id列没有值。我定义映射的方式有问题吗?有人可以帮我解决这个问题吗?
下面是psql
中\ d给出的表模式select * from shoppingcart ;
id | customer_id
-----+-------------
191 | 151
(1 row)
select * from cartitem ;
id | quantity | product_id | cart_id
-----+----------+------------+---------
192 | 3 | 168 |
(1 row)
更新
我做了这个工作\d cartitem
Table "public.cartitem"
Column | Type | Modifiers
----------+---------+-----------
id | bigint | not null
quantity | integer | not null
product_id | bigint |
cart_id | bigint |
Indexes:
"cartitem_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"fk4393e7353ab523e" FOREIGN KEY (product_id) REFERENCES product(id)
"fk4393e7355396066" FOREIGN KEY (cart_id) REFERENCES shoppingcart(id)
现在,在我保存购物车后,cartitem表已经
了cartItem.setCart(cart);//why do I have to do this?
所以,我认为双向关联不起作用.. 有人知道为什么吗?
答案 0 :(得分:0)
在
之后cart.addItem(cartItem);
尝试添加
cartItem.cart = cart;
cartItem.save();
答案 1 :(得分:0)
由于效率问题,如果您的ShoppingCart有数百个CartItem,那么每次调用save时,您必须遍历所有这些,以找到哪些是更新,哪些是添加!