java ORM/Hibernate模式:Foo类有很多条,其中一条是默认条
我会尽量让这件事尽可能简单。我认为它比严格意义上的Hibernate更与ORM相关,但由于我使用Hibernate进行开发,这就是我遇到问题并需要解决的地方。然而,如果其他ORM框架没有这个问题,那么我想知道
尝试模式:类Foo有许多条,其中一条是默认条
我的实现是,吧台有一个foo_id(onetomany),Foo表有一个bar_id(代表一个默认的bar_id。Hibernate在初始化时似乎对此很酷,但当我尝试检索对象Foo列表时,它抛出了一个“key is null”断言错误,并贬低了我的会话管理(奇怪的是,它能够很好地获得其中一个Foo)
我可以想象像hibernate这样的ORM工具在获取一组内容,然后在实体中获取一个相同的内容时可能会遇到的问题。那我该怎么做呢?我总是可以在Bar中设置一个标志,表明这是默认设置,但想象一下,如果我有大量Bar对象,然后我更改了默认设置;我必须更新所有这些行。对我来说,这似乎是个糟糕的解决方案。有什么好办法让这一切顺利吗?我知道你的ORM专家可能有两个或n个现成的解决方案
伪代码,希望能澄清我在下面试图得到的东西
@Table(name="foo")
public class Foo {
protected Collection<Bar> bars = new ArrayList<Bar>();
protected Bar defaultBar = null;
.
.
.
@OneToMany (mappedBy="foo")
public Bar getBars() {
return bars;
}
public void setBars(Collection<Bar> bars) {
this.bars = bars;
}
@OneToOne
@JoinColumn(name="default_bar_id")
public void setDefaultBar(Bar defaultBar) {
this.defaultBar = defaultBar;
}
.
.
.
}
# 1 楼答案
不幸的是,没有一个好方法来做这件事。。正如你所说的,其中一种方法可能是在bar中引入一列来标识默认值,但由于你建议它可以更改,并且你不想更新其他行,所以你可以做的是设置某种可比较的属性,从而确定哪一个是最新的默认值。我在想DateTimeOffset之类的东西。。因此,默认值将是具有最高偏移量的值,可以根据需要进行更新
我能想到的另一个解决方案是引入另一个对象/表来保存这个默认条。像这样的
映射将从Foo到DefaultBar,您可以对其进行更新