Хороший дизайн отображающихся Объектов области Java к Таблицам (использование В спящем режиме),

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

Высоко упрощенный Java и SQL:

Скажите, что у меня есть бизнес-домен POJO под названием 'Изображение' с тремя атрибутами.

class Picture
     int idPicture
     String fileName
     long size

Скажите, что у меня есть другой бизнес-домен POJO под названием "Объект" с 3 атрибутами

 class Item
     int idItem
     String itemName
     ArrayList<Picture> itemPictures

Они были бы нормальными простыми отношениями. Вы могли сказать, что объект 'Изображения', никогда не будет существовать вне объекта 'Объекта'. Предположите, что изображение принадлежит только определенному объекту, но что объект может иметь несколько изображений

Теперь - использование хорошего проектирования баз данных (3-я Нормальная форма), мы знаем, что должны поместить объекты и изображения в их собственных таблицах. Вот то, что я принимаю, было бы корректно.

 table Item
     int  idItem  (primary key)
     String  itemName 

 table Picture
     int   idPicture (primary key)
     varchar(45) fileName
     long  size
     int  idItem  (foreign key)

Вот мой вопрос: Если Вы делаете, в спящем режиме, отображая файлы для этих объектов. В дизайне данных Вашей таблице Picture нужен столбец для обращения к Объекту, так, чтобы отношение внешнего ключа могло сохраняться. Однако в Ваших бизнес-объектах области - Ваш объект Изображения не содержит ссылку/атрибут на idItem Объекта - и не должен знать это. Экземпляр Изображения Java всегда инстанцируют в экземпляре Объекта. Если Вы хотите знать Объект, что Изображение принадлежит Вам уже, находятся в корректном объеме. Назовите myItem.getIdItem () и myItem.getItemPictures (), и у Вас есть эти два сведения, в которых Вы нуждаетесь.

Я знаю, что инструменты Hibernate имеют генератор, который может автоматический делать Ваш POJO из рассмотрения Вашей базы данных. Моя проблема происходит от того, что я распланировал дизайн данных для этого эксперимента/проекта сначала. Затем, когда я пошел для создания доменных объектов Java, я понял, что хороший дизайн продиктовал, что объекты содержат другие объекты вложенным способом. Это очевидно отличается от способа, которым схема базы данных - где все объекты (таблицы) являются плоскими и не содержат никакие другие составные типы в них. Что хороший путь состоит в том, чтобы согласовать это?

:

(A) Сделайте быть в спящем режиме файлы отображения так, чтобы Picture.hbm.xml имел отображение на idItem Поле родителя POJO (если это даже возможно),

(B) Добавьте международный атрибут в классе Изображения, чтобы относиться к idItem и установить его при инстанцировании, таким образом упростив hbm.xml, отображающий файл при наличии всех полей таблицы как локальные атрибуты в классе

(C) Зафиксируйте проектирование баз данных, потому что это неправильно, мужлан.

Я был бы очень признателен за любую обратную связь

5
задан M. McKenzie 20 May 2010 в 08:48
поделиться

4 ответа

Мне кажется, что на Картинке вам ничего не нужно, чтобы ссылаться на его Пункт , как вы сказали, у вас всегда будет Пункт , когда у вас будет Изображение .

Но если окажется, что вам действительно нужна эта ссылка, тогда это случай установки двунаправленной ассоциации «один ко многим» .

Посмотрите, как это делается, здесь:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html

Пример:

<class name="Item">
    <id name="id" column="item_id"/>
    ....
    <set name="pictures" inverse="true">
        <key column="item_id"/>
        <one-to-many class="Picture"/>
    </set>
</class>

<class name="Picture">
    <id name="id" column="picture_id"/>
    ....
    <many-to-one name="item" 
        class="Item" 
        column="item_id"
        not-null="true"/>
</class>
3
ответ дан 15 December 2019 в 06:18
поделиться

Ваша таблица Picture должна быть модифицирована, чтобы содержать ссылку на таблицу item, тогда вы сможете хранить несколько изображений предметов.

Что касается отображения hibernate, вы можете отобразить коллекцию зависимых объектов (картинок) в hbm-файл главного объекта (Item). Это называется компонентным отображением.

Вы можете ознакомиться с руководством по hibernate:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html#components-incollections

0
ответ дан 15 December 2019 в 06:18
поделиться

Я не уверен в конфигурации xml, стоящей за этим, но с помощью аннотаций вы можете просто сделать что-то вроде этого (JPA 2.0):


@Embeddable
class Picture
  int id
  String filename
  long size

class Item
  int idItem
  String itemName

  @ElementCollection
  @CollectionTable(name = "item_picture", joinColumns = @JoinColumn(name = "item_id"))
  List<Picture> pictures
0
ответ дан 15 December 2019 в 06:18
поделиться

Есть ли другие атрибуты ассоциации? Например, даты, статусы и т. Д.? Если это так, я бы смоделировал это как:

 table Item
     int  idItem  (primary key)
     String  itemName 

 table Picture
     int   idPicture (primary key)
     varchar(45) fileName
     long  size

 table ItemPictureAssociation
     int   idItem (foreign key)
     int   idPicture (foreign key)
     int   sequence (composite PK)
     <other columns>

Таким образом, вы можете поддерживать отношения «один ко многим», разделять собственные детали двух объектов и поддерживать атрибуты отношения, если это необходимо.

0
ответ дан 15 December 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: