Хобрук: Ваш путь к мастерству в программировании

проблема с отображением и созданием таблиц при использовании playframework

Я попытался создать веб-приложение, состоящее из shoppingcart и cartitem, используя 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>();
    }
...
}

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

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 [email protected]

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

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)

обновление: я сделал эту работу,

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)

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


Ответы:


1

Сразу после

cart.addItem(cartItem);

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

cartItem.cart = cart;
cartItem.save();
06.09.2011
  • Я заставил это работать, явно вызвав 'cartItem.setCart(cart)..', что должно было произойти из-за двунаправленной ассоциации в отображении.. 06.09.2011

  • 2

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

    08.09.2011
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..