当前位置: 首页 > 面试题库 >

Hibernate返回具有空值的列表(具有列表类型的OneToMany批注)

龚镜
2023-03-14
问题内容

我遇到一个问题,其中Hibernate(4.1.8.FINAL)返回带有NULL值的列表(单向OneToMany映射)。

我得到的是: 我得到一个大小为21的列表,其中EntryAddress在第10个索引上,而2nd 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]]]

我所期望的 -我期望一个只有两个EntryAddress对象的List:

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;

当我尝试用“设置”替换“列表”时,集合没有NULL值,但是序列/优先级不起作用。

我发现的一个有趣的问题是,如果我将1st EntryAddress的优先级设置为1,并将2nd
EntryAddress的优先级设置为2,那么我将得到一个大小为2的列表。因此,尽管在返回List的过程中,优先级似乎起着一定的作用优先级仅应用于排序。

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


问题答案:

我找到了解决方案,我用了它,这解决了问题

@OneToMany(orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name = "entry_id")
@OrderBy("precedence")
private List<EntryAddress> addresses;

@OneToMany(orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name = "entry_id")
@OrderBy("precedence")
private List<EntryContact> contacts;


 类似资料:
  • 如果我有这样的方法: 为什么要编译这个代码?为什么超级字符串与T兼容扩展了CharSequence

  • 问题内容: 我为缓存编写了一个函数来检索特定对象。这样我就不需要投了。 我正在这样使用 但是现在我的缓存中有一个字符串列表,我不能这样使用 问题是。我对Java非常陌生,我该怎么写? 问题答案: 您无法获得的类,在您的情况下,唯一的方法是:

  • 问题内容: 有没有一种方法可以在变量中传递值列表,并在IN()语句中使用它来对照传入的值列表检查字段? 我唯一能想到的就是这样: 谢谢。 问题答案: TD14支持名为STRTOK_SPLIT_TO_TABLE的漂亮表函数:

  • 当交换机分支调用void返回类型的方法时,有没有办法强制对所有枚举值进行彻底检查?仅仅为了诱使编译器要求穷尽性而对产量进行硬编码是非常丑陋的。 这是我当前的模式(handle方法具有void返回类型) 我想使用表达式的原因是在添加新枚举值但未处理时出现编译错误。

  • 我正在使用的数据库有许多具有相同列但(显然)具有不同表名的表(不是我设计的)。例如(这些是数据库表名): 有没有可能用JPA和Hibernate将这些映射到一个Java类实体?类的名称是,然后在使用它时传入例如,以便对象使用表? 还是只使用普通的、普通的Java对象来完成这样的任务更好? 谢谢你!

  • 如果我比较MyClass的两个对象(用@EqualsAndHashcode注释)是否相等,是否会检查newClassList属性的顺序?