在这篇文章http://www.jroller.com/eyallupu/entry/hibernate_the_any_annotation和这个问题中如何使用 Hibernate @Any 相关的注释?,解释了如何使用@Any 注解。但是我怎样才能为每张 DVD/VHS/BOOK 借钱呢?如何在 DVD/VHS/BOOK 上进行映射定义?
2 回答
我不认为这是受支持的,并且如文档中所述:
2.4.5.2。@任何
@Any
注释定义了与来自多个表的类的多态关联。这种类型的映射总是需要多于一列。第一列包含关联实体的类型。其余列包含标识符。 为这种关联指定外键约束是不可能的,因此这绝对不是映射(多态)关联的常用方式。您应该只在非常特殊的情况下使用它(例如审计日志、用户会话数据等)。
虽然我知道已经引入了此注释以将关联属性映射到没有共同祖先实体的不同类型的实体,但我认为最好引入其他实体将从中继承的基本类型以实现双向关系。
也可以看看
是的,一侧是多态的(映射到@Any 或@ManyToAny)的双向关联的问题是Hibernate 自动生成了一个无效的外键。就个人而言,我认为这是一个错误,而不是使用错误。
您可以通过明确指定外键来解决这个问题,即不依赖 Hibernate 来推断它。在 Borrow <--> DVD/VHS/Book 示例中,假设您想要 Borrow 和 DVD/VHS/Book(“项目”)之间的双向多对一关联,然后将其映射到借用多态@Any 机制来借用项目,而在项目侧用@OneToMany 来借用。
但是:在后一个属性/getter 上,您还明确指定要使用的连接列,例如“ITEM_ID”。这应该迫使 Hibernate 仅使用“ITEM_ID”,而不是(如我所见)它默认从另一边的 @Any 定义推断的ITEM_ID + ITEM_TYPE。
如果您没有 DVD/VHS/Book 的“Item”超类,则必须在每个类中声明它,例如:
@Entity
class Book {
...
@OneToMany
@JoinColumn(name="item_id")
public List<Borrow> getBorrows() {
return this.borrows;
}
}