JPA Составление карты объектов - PullRequest
1 голос
/ 11 марта 2011

Исходя из моего слишком популярного вопроса вчерашнего дня:

Hibernate (JPA) отображает HashMap

Я пытаюсь отобразить структуру, котораяпо существу, следующее:

Map<User, List< POJOWithComposite >>

Где User - базовая модель, подобная следующей:

@Entity
public class User extends Model {
   public String username;
   public String password;
   ...
}

и POJOWithComposite - другая сущность, которая имеет некоторые сопоставленные сущности инекоторые примитивы, похожие на:

@Entity
public class POJOWithComposite extends Model {
   public int someIntField;
   public OtherModel compositeEntity;
   ...
}

Структура может быть аналогична корзине для покупок.Таким образом, User содержит информацию об учетной записи, OtherModel может быть покупным товаром, а POJOWithComposite - корзиной покупок, которая, например, содержит товары и количество.Моя аналогия немного нарушается, когда речь идет о главном объекте, но утешите меня, и скажем, для каждой сессии мы добавляем корзину покупок, за которую заплатил пользователь, в список, который затем архивируется, скажем.

* 1022Во-первых, если список принадлежит каждому пользователю, я мог бы просто добавить его в модель User, хотя я чувствую, что он не очень модульный (т. Е. Информация на самом деле не является информацией учетной записи пользователя).Банкомат, эта карта находится в классе покупок, похожем на утилиту, который заботится о том, чтобы сопоставить покупательские тележки с покупателями, чтобы избавить меня от того, чтобы сделать модель User слишком большой.(Есть ли лучший образец для использования здесь, возможно?)

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

Я немного поговорил о том, чтобы легко отобразить ArrayList, потому что это Serializable, хотя здесь это не удалось реализовать.

ТакЯ сделал обертку сущности:

@Entity
public class POJOWithCompositeList extends Model {
   @OneToMany
   List<POJOWithComposite> list = new ArrayList<POJOWithComposite>();
}

Это работает.Когда я использую эту сущность таким образом, я могу отобразить свою новую:

@ManyToMany
Map<User, POJOWithCompositeList>

Хотя мне не очень нравится это решение, потому что я добавляю другую сопоставленную сущность, то есть сущность обертки означает другую таблицу в базе данных,что означает другое присоединение к каждому запросу и т. д. *

Итак, два моих вопроса:

  1. С точки зрения дизайна, допустимо ли вставлять это Map в класс утилит?
  2. Если мы сопоставим модели, как это, как я могу улучшить отображение?

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Нет смысла создавать одноэлементную сущность.Вы должны просто сопоставить связь «один ко многим» между пользователем и POJOWithComposite.

Получить пользователя (используя session.get()) и вызвать user.getPOJOWithComposites(), чтобы получить все POJOWithComposites данного пользователя.Если вы хотите, чтобы они были для нескольких пользователей, найдите этих пользователей с помощью HQL, итерируйте найденных пользователей и перейдите к ассоциации.Синглтон карта - это спящий режим.Используйте его методы для запроса базы данных.

1 голос
/ 16 марта 2011

В итоге я создал новую сущность с @ManyToMany отображениями на составных частях, что-то вроде:

@Entity
public class POJOWithComposites extends Model {

   @ManyToMany
   CompositeType compositePtr;

   @ManyToMany
   CompositeOtherType compositeOtherPtr;

   ...
}

Таким образом, я действительно исключил этот элемент сложности из моей модели User, поскольку он не был частью основной сущности пользователя и позволял эффективное отображение (внешние ключи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...