簡體   English   中英

將Java Domain對象映射到Tables的好設計(使用Hibernate)

[英]Good design of mapping Java Domain objects to Tables (using Hibernate)

我有一個問題,更多的是在設計領域,而不是實現。 我也很高興有人指出答案的資源,我很樂意為自己研究。

高度簡化的Java和SQL:

假設我有一個名為'Picture'的業務域POJO,它有三個屬性。

class Picture
     int idPicture
     String fileName
     long size

假設我有另一個名為“Item”的業務域POJO,其中包含3個屬性

 class Item
     int idItem
     String itemName
     ArrayList<Picture> itemPictures

這些將是一種正常的簡單關系。 你可以說'Picture'對象永遠不會存在於'Item'對象之外。 假設圖片僅屬於特定項目,但項目可以具有多個圖片

現在 - 使用良好的數據庫設計(第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表需要一個列來引用Item,以便可以保持外鍵關系。 但是,在您的業務域對象中 - 您的Picture對象不包含Item的idItem的引用/屬性 - 並且不需要知道它。 始終在Item實例中實例化java Picture實例。 如果您想知道圖片所屬的項目,您已經在正確的范圍內。 調用myItem.getIdItem()和myItem.getItemPictures(),您將獲得所需的兩條信息。

我知道Hibernate工具有一個生成器,可以自動讓你的POJO查看你的數據庫。 我的問題源於我首先計划了這個實驗/項目的數據設計。 然后,當我去創建域java對象時,我意識到良好的設計決定了對象以嵌套的方式保存其他對象。 這顯然不同於數據庫模式的方式 - 所有對象(表)都是平面的,並且不包含其他復雜類型。 調和這個的好方法是什么?

你會:

(A)制作hibernate映射文件,使Picture.hbm.xml具有到POJO父節點的idItem字段的映射(如果可能的話)

(B)在Picture類中添加一個int屬性來引用idItem並在實例化時將其設置,從而通過將所有表字段作為類中的本地屬性來簡化hbm.xml映射文件

(C)修復數據庫設計因為它錯了,dork。

我真的很感激任何反饋

在我看來,你真的不需要Picture任何東西來引用它的Item ,因為你說你擁有Picture時總是會有Item

但如果事實證明你真的需要這個引用,那么設置雙向一對多關聯就是這種情況。

看看這是如何完成的:

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>

您需要修改您的圖片表以保存對項目表的引用,然后您可以存儲多個項目圖片。

對於hibernate映射,您可以在主對象(Item)的hbm文件中映射一組依賴對象(圖片)。 它被稱為組件映射。

你可以查看一下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>

這樣,您可以保持一對多關系,將兩個對象自己的詳細信息分開,並在需要時維護關系的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM