gpt4 book ai didi

java - Hibernate 返回具有空值的列表(具有 List 类型的 OneToMany 注释)

转载 作者:可可西里 更新时间:2023-11-01 06:39:31 24 4
gpt4 key购买 nike

我遇到一个问题,因为 Hibernate (4.1.8.FINAL) 返回一个包含 NULL 值的列表(单向 OneToMany 映射)。

我得到了什么:我得到一个大小为 21 的列表,其中 EntryAddress 在第 10 个索引上,而第 2 个条目地址在第 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 的列表。因此似乎优先级在返回过程中发挥了作用List 的优先级应该只用于排序。

你能告诉我我做错了什么吗?谢谢:-)

最佳答案

来自 OrderColumn 的 javadocs:“顺序列必须是整数类型。持久性提供程序在更新关联或元素集合时维护顺序列值的连续(非稀疏)排序。顺序列值的第一个元素是 0。”

因此,期望 OrderColumn 的值从 0 开始并且是连续值。因此,当值不连续时,Hibernate 会将 null 元素添加到您的 Java 列表中。

我认为 OrderColumn 的这种行为类似于 hibernate xml 映射中的列表索引行为。

关于java - Hibernate 返回具有空值的列表(具有 List 类型的 OneToMany 注释),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13307849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com