2011-11-18 33 views
0

我会尽量保持这个尽可能简单。我认为它比严格的Hibernate有更多的ORM相关,但是因为我正在开发使用Hibernate,所以我遇到了问题并且需要解决方案。但是,如果这个其他的ORM框架没有这个问题,那么我想知道。ORM /休眠模式:类Foo有很多酒吧,其中一个酒吧是默认的

尝试模式:Foo类有很多酒吧,其中一个酒吧是默认的。
我的实现是Bar表有一个foo_id(onetomany),而Foo表有一个bar_id(表示一个单一的bar,默认情况下,Hibernate在初始化时看起来很酷,但当我尝试检索一个列表对象Foo它抛出一个“键是空的”断言错误和贬低我的会话管理(奇怪它能够得到一个foos就好)。

我可以想象的问题,像休眠ORM工具可能有一些东西,然后在实体中得到同样的东西,那么我该怎么做呢?我总是可以在Bar中设置一个标志,它是默认的,但想象一下,如果我有大量的Bar对象,然后我改变了默认值;我将不得不更新所有这些行。这似乎对我来说是一个糟糕的解决方案。正确的方法来完成这项工作?我知道你们的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; 
    } 
    . 
    . 
    . 
} 

回答

0

不幸的是心不是一个很好的办法做到这一点。像你说的方法之一可能是在酒吧介绍一栏,以确定默认值,但因为你是暗示它可以改变你不想更新其他行你可以做的事情可能是设置某种可比较的属性,因此你可以确定哪一个是最新的默认值。我正在考虑类似DateTimeOffset ..因此,默认情况下,您将更新的偏移量最高的为默认值。

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

public Class DefaultBar 
{ 
public Bar DefaultBar; 
} 

和映射将从Foo到DefaultBar,您可以更新。