有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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

    public Class DefaultBar
    {
    public Bar DefaultBar;
    }
    

    映射将从Foo到DefaultBar,您可以对其进行更新