У меня есть вопрос, который находится больше в области дизайна, чем реализация. Я также рад за любого указать на ресурсы для ответа, и я буду с удовольствием, исследование для меня.
Высоко упрощенный 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) Зафиксируйте проектирование баз данных, потому что это неправильно, мужлан.
Я был бы очень признателен за любую обратную связь
Мне кажется, что на Картинке
вам ничего не нужно, чтобы ссылаться на его Пункт
, как вы сказали, у вас всегда будет Пункт
, когда у вас будет Изображение
.
Но если окажется, что вам действительно нужна эта ссылка, тогда это случай установки двунаправленной ассоциации «один ко многим» .
Посмотрите, как это делается, здесь:
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>
Ваша таблица Picture должна быть модифицирована, чтобы содержать ссылку на таблицу item, тогда вы сможете хранить несколько изображений предметов.
Что касается отображения hibernate, вы можете отобразить коллекцию зависимых объектов (картинок) в hbm-файл главного объекта (Item). Это называется компонентным отображением.
Вы можете ознакомиться с руководством по hibernate:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html#components-incollections
Я не уверен в конфигурации 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
Есть ли другие атрибуты ассоциации? Например, даты, статусы и т. Д.? Если это так, я бы смоделировал это как:
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>
Таким образом, вы можете поддерживать отношения «один ко многим», разделять собственные детали двух объектов и поддерживать атрибуты отношения, если это необходимо.