Java ORM/Hibernate模式:类Foo有许多条,其中一条是默认条

Java ORM/Hibernate模式:类Foo有许多条,其中一条是默认条,java,hibernate,orm,Java,Hibernate,Orm,我会尽量让这件事尽可能简单。我认为它比严格意义上的Hibernate更与ORM相关,但由于我使用Hibernate进行开发,这就是我遇到问题并需要解决的地方。然而,如果其他ORM框架没有这个问题,那么我想知道 尝试模式:类Foo有许多条,其中一条是默认条。 我的实现是Bar表有一个foo_id(onetomany),而foo表有一个Bar_id(表示默认的单个Bar)。Hibernate在初始化时似乎对此非常冷静,但当我尝试检索对象foo列表时,它抛出了一个“key is null”断言错误,并

我会尽量让这件事尽可能简单。我认为它比严格意义上的Hibernate更与ORM相关,但由于我使用Hibernate进行开发,这就是我遇到问题并需要解决的地方。然而,如果其他ORM框架没有这个问题,那么我想知道

尝试模式:类Foo有许多条,其中一条是默认条。
我的实现是Bar表有一个foo_id(onetomany),而foo表有一个Bar_id(表示默认的单个Bar)。Hibernate在初始化时似乎对此非常冷静,但当我尝试检索对象foo列表时,它抛出了一个“key is null”断言错误,并贬低了我的会话管理。(奇怪的是,它能很好地得到一种食物。)

我可以想象像hibernate这样的ORM工具在获取一组东西,然后在实体中获取一个相同的东西时可能会遇到的问题。那么我该怎么做呢?我总是可以在Bar中设置一个标志,表明这是默认的,但是想象一下,如果我有大量的Bar对象,然后我更改了默认值;我将不得不更新所有这些rows。对我来说,这似乎是一个糟糕的解决方案。有没有正确的方法来实现这一点的想法?我知道你的ORM专家可能有2个或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;
  }
  .
  .
  .
}
@Table(name=“foo”)
公开课Foo{
受保护的集合栏=新的ArrayList();
受保护条defaultBar=null;
.
.
.
@OneToMany(mappedBy=“foo”)
公共酒吧{
返回杆;
}
公共空间立杆(收集杆){
这个。巴=巴;
}
@奥内托内
@JoinColumn(name=“default\u bar\u id”)
公共void setDefaultBar(Bar defaultBar){
this.defaultBar=defaultBar;
}
.
.
.
}

不幸的是,没有一个很好的方法可以做到这一点。正如您所说,其中一种方法可以是在工具栏中引入一列来标识默认值,但由于您建议它可以更改,并且您不想更新其他行,所以您可以做的可能是设置某种可比较的属性,从而确定哪一行是最新的默认值。我在想DateTimeOffset之类的东西。因此,默认值将是具有最高偏移量的值,您可以根据需要随时更新

我能想到的另一个解决方案是引入另一个对象/表来保存这个默认条

public Class DefaultBar
{
public Bar DefaultBar;
}
映射将是从Foo到DefaultBar,您可以对其进行更新