Как сохранить сложный объект в Entity в EJB3? - PullRequest
1 голос
/ 17 декабря 2011

Я работаю над проектом магазина DVD, основанного на EJB3.

В рамках этого проекта клиент может выбрать DVD и поместить DVD в корзину, а затем в корзине будет создана запись бронирования.

Моя проблема в том, что я хочу, чтобы резервирование было Entity (таблица в базе данных), но у него есть свойство ShoppingCart, которое является сложным объектом; сущность не поддерживает хранение сложного объекта, я не знаю, как решить эту проблему?

Кто-нибудь может дать мне какое-нибудь предложение или лучшее решение?

Вот этот класс:

    public class ShoppingCartItem {
      private DVD item;
      private int quantity;
    …
    }

    public class ShoppingCart {
      private HashMap<String, ShoppingCartItem> items;
      private int numberOfItems;
      …
    }

    @Entity
    public class DVD implements Serializable { 
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
      private String title; 
      …
    }


    @Entity
    public class Reservation implements Serializable {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
      //the problem is here
      private ShoppingCart cart;
      …
    }

1 Ответ

1 голос
/ 17 декабря 2011

Вы должны определить, какую информацию о ShoppingCart вы хотите сохранить.

В сущности JPA (которую вы называете «сущностью в EJB 3») вы можете хранить:

  • простые поля (строки, целые и т. Д.),
  • встраиваемые объекты (объекты, хранящиеся в БД, но без постоянной идентичности - другими словами - без "id"),
  • отношения с другими сущностями,
  • любой объект, который сериализуем.

Похоже, ваше дело решается с помощью третьего или четвертого варианта.

Хранение сериализуемого объекта

Если вы хотите просто сохранить весь объект целиком, вы должны добавить implements Serializable к вашему ShoppingCar, и он должен быть правильно сохранен в базе данных.
Тем не менее, он будет сохранен с использованием Java Serialization (так что это будет двоичное представление объекта, переданного во время сохранения). Это довольно необычный способ достижения вашей цели.

Использование связей сущностей

Рассматривали ли вы сделать ShoppingCart сущностью? Таким образом, вы можете использовать отношения и сохранять весь объект при сохранении объекта Reservation, т.е.

 @Entity
 public class Reservation implements Serializable {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;

      @OneToOne
      private ShoppingCart cart;
      // ...
    }

В приведенном выше примере предполагается, что ровно один Reservation будет связан с ровно одним ShoppingCart.

Другим способом достижения вашей цели является расширение сущности Reservation и добавление полей для заказанных продуктов, т. Е .:

 @Entity
 public class Reservation implements Serializable {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;

      @ElementCollection
      private Map<DVD, Integer> items;
    }

Обратите внимание на использование Map в качестве интерфейса вместо HashMap, который всегда предпочтителен (если не требуется JPA.) Также обратите внимание, что в одной структуре вы можете хранить как элемент, так и его количество, купленное пользователь.

Помните, что в этом примере DVD должен быть сущностью (что вполне разумно, поскольку вы, вероятно, будете хранить все свои предметы в базе данных).

...