Hibernate返回带有空值的列表(带有List类型的OneToMany注释)
我遇到一个问题,因为Hibernate(4.1.8.FINAL)返回一个包含NULL值的列表(单向OneToMany映射)。
我得到的是:我得到一个大小为21的List,其中EntryAddress在第10个索引上,第二个Entry Address在第20个索引上。
Entry [addresses=[null, null, null, null, null, null, null, null, null, null, EntryAddress [id=5, entryId=3, precedence=10, line=Line 3.1], null, null, null, null, null, null, null, null, null, EntryAddress [id=6, entryId=3, precedence=20, line=Line 3.2]]]
我所期待的 – 我希望List只有两个EntryAddress对象:
Entry [addresses=[EntryAddress [id=5, entryId=3, precedence=10, line=Line 3.1], EntryAddress [id=6, entryId=3, precedence=20, line=Line 3.2]]]
这是最小的源代码:
@Entity @Table(name = "entry") public class Entry { ... @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true) @JoinColumn(name = "entry_id") @OrderColumn(name = "precedence") private List addresses; ... }
@Entity @Table(name = "entry_address") public class EntryAddress { @Id @GeneratedValue @Column(name = "id") private Integer id; @Column(name = "entry_id") private Integer entryId; @Column(name = "precedence") private Integer precedence; ... }
这是mysql结构(引擎InnoDB):
CREATE TABLE entry ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(500) NOT NULL, active int(1) NOT NULL DEFAULT '0', modifiedTS timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, createdTS timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY ( id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -------------------------------------------------------- CREATE TABLE entry_address ( id int(10) unsigned NOT NULL AUTO_INCREMENT, entry_id int(10) unsigned NULL, precedence int(2) NULL DEFAULT '0', line varchar(255) DEFAULT NULL, PRIMARY KEY ( id ), UNIQUE KEY entry_address_uq ( entry_id , precedence ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当我尝试用“Set”替换“List”时,集合没有NULL值,但序列/优先级不起作用。
我发现一个有趣的观点是,如果我将1st EntryAddress的优先级设置为1,并将2nd EntryAddress的优先级设置为2,那么我将得到一个大小为2的List。所以看起来优先级在返回List时起作用尽管优先级只应用于排序。
你能告诉我我做错了什么吗? 谢谢 :-)
从OrderColumn的javadoc:“order列必须是整数类型。持久性提供程序在更新关联或元素集合时维护order列的值的连续(非稀疏)排序 。第一个的order列值元素是0.“
因此,期望OrderColumn的值从0开始并且是连续值。 因此,当值不连续时,Hibernate会将空元素添加到Java列表中。
我认为OrderColumn的这种行为类似于hibernate xml映射中的list-index行为。
问题是List和Set之间的区别。
我得到一个大小为21的List,其中EntryAddress在第10个索引上,第二个Entry Address在第20个索引上。
这是一个非常好的集合,它应该是List!
当您“将List替换为Set”时,您是否记得删除@OrderColumn(name = "precedence")
? 因为如果您使用Set,则不能拥有Order列。
我找到了解决方案,我用它并解决了这个问题
@OneToMany(orphanRemoval = true) @LazyCollection(LazyCollectionOption.FALSE) @JoinColumn(name = "entry_id") @OrderBy("precedence") private List addresses; @OneToMany(orphanRemoval = true) @LazyCollection(LazyCollectionOption.FALSE) @JoinColumn(name = "entry_id") @OrderBy("precedence") private List contacts;
- persistence.xml中的Sequence Generator
- 密钥’PRIMARY’的重复条目’string1-string2′
- 基于Hibernate的Java Servlet应用程序中的Hibernate Communications Link失败,由MySQL提供支持
- 为什么@OneToMany在Hibernate中不能inheritance
- 如何为List创建ConstraintValidator
- 如何在执行特定查询后更改会话NLS_COMP / SORT
- 设置Id(PK)生成值auto和manual
- 将Excel数据转换为MySql表
- 为什么在Spring 3.1和hibernate 4中找到当前线程exception的No Session