将Java Domain对象映射到Tables的好设计(使用Hibernate)

M. *_*zie 5 java orm database-design domain-driven-design hibernate

我有一个问题,更多的是在设计领域,而不是实现.我也很高兴有人指出答案的资源,我很乐意为自己研究.

高度简化的Java和SQL:

假设我有一个名为'Picture'的业务域POJO,它有三个属性.

class Picture
     int idPicture
     String fileName
     long size
Run Code Online (Sandbox Code Playgroud)

假设我有另一个名为"Item"的业务域POJO,其中包含3个属性

 class Item
     int idItem
     String itemName
     ArrayList<Picture> itemPictures
Run Code Online (Sandbox Code Playgroud)

这些将是一种正常的简单关系.你可以说'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)
Run Code Online (Sandbox Code Playgroud)

这是我的问题:如果您正在为这些对象制作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.

我真的很感激任何反馈

b.r*_*oth 3

在我看来,你真的不需要任何东西来Picture引用它,正如你所说,当你拥有 时,Item你将永远拥有。ItemPicture

但如果事实证明你确实需要这个引用,那么就是设置双向一对多关联的情况。

在这里查看这是如何完成的:

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>
Run Code Online (Sandbox Code Playgroud)