使用Play框架时映射和创建表的问题

时间:2011-09-06 14:19:31

标签: java jpa mapping playframework

我尝试使用shoppingcart创建一个由cartitemplayframework组成的网络应用。我创建了以下映射,当我尝试运行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?

所以,我认为双向关联不起作用.. 有人知道为什么吗?

2 个答案:

答案 0 :(得分:0)

之后
cart.addItem(cartItem);

尝试添加

cartItem.cart = cart;
cartItem.save();

答案 1 :(得分:0)

由于效率问题,如果您的ShoppingCart有数百个CartItem,那么每次调用save时,您必须遍历所有这些,以找到哪些是更新,哪些是添加!