在使用set集合时,如果集合中的元素是组件类或者是实体类,那么编写组件类或实体类时一定要实现equals()和hashCode()。
pom.xml:
resources/hibernate.cfg.xml:
pojo/Image.java:
pojo/Item.java:
pojo/Item.hbm.xml:
注意:<composite-element>中的property中都必须加not-null="true"
util/HibernateUtil.java:
util/Manager.java:
表结构:
输出sql与日志:
上例中,Image是Item的一个组件,Item则是负责Image实例的生命周期的实体。
首先,把Image类实现为一般的POJO。由于组件类没有标识符属性,你必须实现equals()(和hashCode()),并比较name,fileName,sizeX,sizeY属性。hibernate依赖这个等同性子程序检查实例中的修改。并非所有的组件类都需要equals()和hashCode()的定制实现。但是,我们建议把它用于任何组件类,因为这种实现很简单,并且"小心不出大错”可是至理名言。
组件的集合被类似地映射到JDK值类型的集合。唯一的区别是用<composite-element>代替了<element>标签。
这是一个集,因此集合表的主键是键列和所有元素列的一个复合。ITEM_ID,IMAGENAME,FILENAME,SIZEX,SIXEY。因为这些列都出现在主键中,需要用not-null="true"声明它们。复合主键中任何列都不可以为空---因为你无法辨别不知道的东西,这可能是这个特定映射的一个缺点。