如何在@Any带注释的属性上进行双向映射?

时间:2010-07-09 11:57:25

标签: java hibernate orm any

在本文http://www.jroller.com/eyallupu/entry/hibernate_the_any_annotation以及此问题How to use Hibernate @Any-related annotations?中,解释了如何使用@Any注释。但是我怎样才能为每张DVD / VHS / BOOK借款?如何在DVD / VHS / BOOK上进行映射定义?

2 个答案:

答案 0 :(得分:5)

我不支持认为这是支持的,并且正如文档中所述:

  

2.4.5.2. @Any

     

@Any注释定义了一个   与类的多态关联   来自多个表。这类   映射总是需要不止一个   柱。第一列包含   关联实体的类型。该   其余列包含标识符。   指定外国人是不可能的   这种关键约束   协会,所以这是肯定的   不是通常的映射方式   (多态)关联。你应该   仅在非常特殊的情况下使用它   (例如,审计日志,用户会话数据,   等)。

虽然我理解这个注释已被引入以将关联属性映射到不具有共同祖先实体的不同类型的实体,但我认为引入其他实体将继承的基本类型会更好双向关系。

另见

答案 1 :(得分:2)

是的,一方是多态的双向关联问题(用@Any或@ManyToAny映射)是Hibernate自动生成无效外键。就个人而言,我认为这是一个错误,而不是用法错误。

你可以通过明确指定外键来解决这个问题,即不依赖于Hibernate来推断它。在Borrow< - >中DVD / VHS /书籍示例,假设您想要Borrow和DVD / VHS / Book(“项目”)之间的双向,多对一关联,然后将其映射到 Borrow 将多态@Any机制添加到item,并在侧添加@OneToMany to Borrow。

但是:在后一个属性/ getter上,您还明确指定要使用的连接列,例如: “ITEM_ID”。这应该强制Hibernate只使用“ITEM_ID”,而(正如我所见)ITEM_ID + ITEM_TYPE默认情况下从其他人的@Any定义推断侧。

如果您没有DVD / VHS / Book的“Item”超类,则必须在每个类中声明这一点,例如:

@Entity
class Book {
    ...
    @OneToMany
    @JoinColumn(name="item_id")
    public List<Borrow> getBorrows() {
        return this.borrows;
    }
}