проблема с отображением и созданными таблицами при использовании playframework - PullRequest
0 голосов
/ 06 сентября 2011

Я попытался создать веб-приложение, состоящее из shoppingcart и cartitem s, используя playframework. Я создал следующие сопоставления, и когда я попытался запустить веб-приложение, я обнаружил, что созданные таблицы postgres db не имеютзначения, которые создают двунаправленную связь.

@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>();
    }
...
}

Когда я добавил cartitem в корзину,

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("/");
    }

Когда этот метод был выполнен во время публикации, оператор println () произвел

create cartitem from 3 copies of product=Product1 for user=jon@gmail.com

Созданные таблицы показали эти данные

select * from shoppingcart ;
 id  | customer_id 
-----+-------------
 191 |         151
(1 row)

select * from cartitem ;
 id  | quantity | product_id | cart_id 
-----+----------+------------+---------
 192 |        3 |     168    |        
(1 row)

Столбец cart_id не имеет значения . Есть ли какая-то проблема в том, как я определил свои отображения?Может кто-нибудь помочь мне решить эту проблему?

ниже приведена схема таблицы, заданная \ d в psql

\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)

update: Я сделал эту работу к

cartItem.setCart(cart);//why do I have to do this?

Теперь, после сохранения корзины, таблица cartitem имеет

select * from cartitem;
 id  | quantity | product_id | cart_id 
-----+----------+------------+---------
 197 |        4 |     164    |     196
(1 row)

Итак, я думаю, что двунаправленная ассоциация не работает .. Кто-то знает почему?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

из-за эффективности, если ваша ShoppingCart имеет сотни CartItem, каждый раз, когда вы вызываете save, вы должны пройти через все из них, чтобы найти, какие обновления, какие добавляются!

0 голосов
/ 06 сентября 2011

Сразу после

cart.addItem(cartItem);

Попробуйте добавить

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