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.
我真的很感激任何反馈
在我看来,你真的不需要任何东西来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)
| 归档时间: |
|
| 查看次数: |
4015 次 |
| 最近记录: |