我有一个对象“ Foo”,其中包含其他对象“ Bar”的列表。如果加载Foo的修订版,则会得到正确排序的Bars列表-但是,我还会得到一些null。如果查看包含条形图的审核表,则在保存的初始对象上会看到类似以下内容:
id | rev | revtype | create_timestamp | update_timestamp | updated_by_id | created_by_id | foo_id | bar_index | bar_value
------+------+---------+-------------------------+-------------------------+---------------+---------------+-----------------------+---------------+-----------
1000 | 1000 | 0 | 2018-09-28 12:26:48.49 | 2018-09-28 12:26:48.49 | 1 | 1 | | | ValueA
1001 | 1000 | 0 | 2018-09-28 12:26:48.49 | 2018-09-28 12:26:48.49 | 1 | 1 | | | ValueB
1000 | 1000 | 0 | | | | | 1000 | 0 |
1001 | 1000 | 0 | | | | | 1000 | 1 |
因此,将来我想使用Foo,它的Bar的修订版为1000,我最终得到2个null和两个值。看到那张桌子我并不完全惊讶。如果感觉像如何处理列表的错误,那么如果将其更改为一个集合,它就可以正常工作(因此,我想我可以将其保留为一个集合,然后自己填充索引列并在加载时自己对其进行排序-但这不是对于对象层次结构和很多列表而言非常有用),但是我在做事时可能会有所遗漏。
在栏中映射:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "foo_id")
@OrderColumn(name = "bar_index")
private List<Bar> bars = new ArrayList<>();
关于如何在不使加载列表中包含null的情况下进行此项工作的任何想法?是Envers错误,Hibernate错误,用户错误吗?谢谢!
答案 0 :(得分:0)
这是我想发生的事情(以及解决方法)。上面是一个不使用联接表的单向OneToMany关系。因此,您只有FOO和BAR表。
就我而言,我碰巧将它们命名为FOO和FOO_BAR(以及相关的_AUD表)
但是,在这种情况下(出于各种良好的原因),Envers需要一个附加的审计联接表,并强制存在一个名为ONE_MANY_AUD的联接表,因此,在这种情况下,似乎期望FOO,FOO_AUD,BAR,BAR_AUD,FOO_BAR_AUD并强制审核联接表按预期存在。
我只有FOO,FOO_AUD,FOO_BAR和FOO_BAR_AUD,Envers可以配合使用,因为它似乎与预期的联接表命名相匹配,但是会引起问题中所述的问题。
我不确定在这种情况下Envers会做什么,似乎正在尝试将Bar和Foo-Bar关系的审核放入同一张表中。
太固定了,我可以使我的Bar表实际上称为BAR(带有BAR_AUD),并添加预期的审计联接表FOO_BAR_AUD。在这一点上,事情按预期进行,并且在检索FOO的修订版时,我在BAR列表中没有出现空值。
如果可能的话,最好在Envers中更新检查以赶上这种情况(我正在成功地猜测发生了什么!)