pom.xml:
resources/hibernate.cfg.xml:
pojo/Item.java:
pojo/Item.hbm.xml:
根据测试,集合中如果有null值,它是不会被插入到集合表中的,也不会报错。
util/HibernateUtil.java:
util/Manager.java:
表结构:
输出sql:
允许重复元素的无序集合被称作包(bag)。奇怪的是,java Collections框架没有包括包实现。然而,java.util.Collection接口有包语义,因此只需要一种相匹配的实现。你有两种选择:
. 用java.util.Collection接口编写集合属性,并在声明中用JDK的一个ArrayList对它进行初始化。在hibernate中用标准的<bag>或<idbag>元素映射集合。hibernate有一个内建的PersistemntBag可以处理列表;但与包的约定一致,它忽略元素在ArrayList中的位置。换句话说,你得到了一个持久化的Collection。
. 用java.util.List接口编写集合属性,并在声明中用JDK的一个ArrayList把它初始化。像前一个选项一样映射它,但是在领域模型类中公开了一个不同的集合接口。这种方法有效,但不建议使用,因为使用这个集合属性的客户端可能认为元素的顺序会始终被保存着,其实如果把它作为<bag>或者<idbag>映射,就并非如此了。
建议使用第一个选项。
上例中,表需要一个不同的主键,<idbag>映射添加了一个代理键列到集合表,很像用于实体类的合成标识符.
注意:主键的native生成器不支持<idbag>映射,必须指定一种具体的策略。还要注意:ITEM_IMAGE_ID列没有以任何方式公开给应用程序。Hibernate内部管理它。