我遇到了一个问题,Hibernate(4.1.8.FINAL)返回一个包含NULL值的列表(单向OneToMany映射)。
我的问题: 我得到了一个大小为21的List,其中EntryAddress在第10个索引上,第2个EntryAddress在第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]]]
我期望的是 - 我期望得到一个只包含两个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<EntryAddress> 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值,但是顺序/先例不起作用。
我发现一个有趣的点是,如果我将第一个EntryAddress的优先级设置为1,并将第二个EntryAddress的优先级设置为2,那么我将得到一个大小为2的列表。因此,尽管优先级只应用于排序,但它似乎在返回列表时也起了作用。
请问我做错了什么?谢谢 :-)