假设我有以下类结构:
/** 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
但是正确的做法吗?
答案 0 :(得分:2)
你很接近,但你不能只是从另一个实体继承并改变那样的表。实体继承必须遵循提供的继承模型之一。您的用例可能就像将@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
添加到超类一样简单。如果您与其他类有一些更复杂的映射,则存在一些限制。由于它无法告诉哪个表基于超类的映射实际存在,因此无法通过它进行连接。并且超类的映射需要每次都检查两个表。您当然还需要在层次结构中的所有表中生成唯一ID。您可能需要考虑使用抽象超类,并将两个具体实体都设置为叶类。那么当你知道它是哪一个时,至少你可以随时使用一个表。
或者,您可以在@MappedSuperclass
中声明列映射,然后每个子类都可以是具有表映射的实体。如果是遗留数据并且“常规”和“复制”表中没有唯一ID,那么这可能会更好。