如何扩展hibernate注释类以将字段指向不同的hibernate实体?

时间:2011-06-14 03:06:24

标签: java hibernate

假设我有以下类结构:

/** Boring bits snipped */
@Entity
@Table(name = "Foo")
public class Foo {
    @JoinColumn(name = "id")
    private Bar bar;
    /** Other flat data goes here */
}

@Entity
@Table(name = "Bar")
public class Bar {
    /** Some data goes here */
}

由于我不打算进入,我有这些表的副本,我也要映射,这些表应该在Java中显示为Foo和{ {1}}个对象。最重要的是,在处理复制的对象时,表之间的关系应该在复制的表之间。

这样做的最正确方法是什么?

我猜我可以这样的事情:

Bar

是正确的做法吗?

1 个答案:

答案 0 :(得分:2)

你很接近,但你不能只是从另一个实体继承并改变那样的表。实体继承必须遵循提供的继承模型之一。您的用例可能就像将@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)添加到超类一样简单。如果您与其他类有一些更复杂的映射,则存在一些限制。由于它无法告诉哪个表基于超类的映射实际存在,因此无法通过它进行连接。并且超类的映射需要每次都检查两个表。您当然还需要在层次结构中的所有表中生成唯一ID。您可能需要考虑使用抽象超类,并将两个具体实体都设置为叶类。那么当你知道它是哪一个时,至少你可以随时使用一个表。

或者,您可以在@MappedSuperclass中声明列映射,然后每个子类都可以是具有表映射的实体。如果是遗留数据并且“常规”和“复制”表中没有唯一ID,那么这可能会更好。