2012-05-30 40 views
0

我正试图对一个表执行一个自引用映射(父/子样关系)映射。基于外键值Hibernate ORM映射的歧视

我想要的是来自同一张表的两个不同的实体,以便我可以分开属性等等。我正在考虑使用鉴别器值,但我不能这样做,因为我的数据库已经被定义为以下内容:为了区分父对象和子对象,我们有parent_id对于子类型不为null(parent_id当然是外键到同一张桌子)。无法通过以下方式定义鉴别器值:如果对象是父类型,则鉴别器值为null否则为child。

我正在寻找解决方案,我有点卡住了。也许,我将最终使用一个实体,它带有两个引用父对象的属性(对于child,@ManyToOne不是null)和子对象列表(对于子对象,@OneToMany为null)。但在此之前(现在,我必须决定使用一个实体),我想问一下是否有工作来执行我正在尝试做的事情。

回答

1

鉴别器可以是一个“公式”。这完全是Hibernate特性,并且不受JPA支持。你可以使用@ org.hibernate.annotations.DiscriminatorFormula,是这样的:

@Entity 
@Inheritance(strategy=SINGLE_TABLE) 
@DiscriminatorFormula("case when parent_id is null then 'PARENT' ELSE 'CHILD' end") 
@DiscriminatorValue("PARENT") 
public class Parent { 
    ... 
} 

// map Child using @DiscriminatorValue("CHILD") 
+0

谢谢您的回答。直到现在我还没有意识到这个功能。这正是我所期待的。到目前为止,我们只被允许使用JPA支持的Hibernate特性,我希望这可能是个例外。无论如何,我认为从现在开始,我将在我的个人项目中使用此功能。再次谢谢你! – aslan

+0

然后把这个标记为正确的答案;) –

+0

对不起,我忘了它:)现在它完成了再次感谢! – aslan

0

另一种解决方案是利用特殊的hibernate值@DiscriminatorValue("null")@DiscriminatorValue("not null")

@Entity 
@Inheritance(strategy=SINGLE_TABLE) 
@DiscriminatorColumn("parent_id") 
@DiscriminatorValue("null") 
public class Parent { 
    ... 
} 

@Entity 
@DiscriminatorValue("not null") 
public class Child extends Parent { 
    ... 
}