Хороший дизайн отображения объектов Домена Java в Таблицы (используя Hibernate) - PullRequest
5 голосов
/ 20 мая 2010

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

Очень упрощенный Java и SQL:

Допустим, у меня есть бизнес-домен POJO под названием 'Picture' с тремя атрибутами.

class Picture
     int idPicture
     String fileName
     long size

Допустим, у меня есть еще один бизнес-домен POJO под названием "Item" с 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)

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

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

Не могли бы вы:

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

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

(C) Исправить структуру базы данных, потому что она неправильная, придурок.

Буду очень признателен за любые отзывы

Ответы [ 4 ]

3 голосов
/ 20 мая 2010

Мне кажется, что вам не нужно ничего в Picture, чтобы ссылаться на его Item, поскольку вы сказали, что у вас всегда будет Item, когда у вас есть Picture.

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

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

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>
0 голосов
/ 26 мая 2010

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

 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 голосов
/ 25 мая 2010

Я не уверен насчет конфигурации 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 голосов
/ 20 мая 2010

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

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

Вы можете проверить руководство по спящему режиму:

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

...