Java 如何扩展hibernate注释类以将字段指向不同的hibernate实体?
假设我有以下类结构:Java 如何扩展hibernate注释类以将字段指向不同的hibernate实体?,java,hibernate,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 her
/** 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
和Bar
对象。最重要的是,在处理复制的对象时,表之间的关系应该在复制的表之间
最正确的方法是什么?
我猜我可能可以做这样的事情:
@Entity
@Table(name = "OtherFoo")
public class OtherFoo extends Foo {
@JoinColumn(name = "id")
private OtherBar bar;
}
@Entity
@Table(name = "OtherBar")
public class OtherBar extends Bar {
}
但是这样做对吗?你很接近了,但是你不能仅仅从另一个实体继承并像那样更改表。实体继承必须遵循提供的继承模型之一。对于您的用例,它可能非常简单,只需将
@heritance(strategy=InheritanceType.TABLE\u PER\u CLASS)
添加到超类中。如果您有一些与其他类的更复杂的映射,那么这会有一些限制。由于它无法判断基于超类的映射实际位于哪个表中,因此它无法通过它进行连接。到超类的映射需要每次检查两个表。当然,您还需要跨层次结构中的所有表生成唯一的ID。您可能需要考虑使用抽象超类,并将两个具体实体都作为叶类。那么,至少当你知道哪张桌子是你的时候,你可以一直只使用一张桌子
或者,您可以在
@MappedSuperclass
中声明列映射,然后每个子类都可以是具有表映射的实体。如果是遗留数据,并且在“常规”和“复制”表中没有唯一的ID,那么这可能会更好 通常我会做一个小项目并测试它,但我现在还不能这样做:(听起来像是有一个带有两个子类的@MappedSuperClass
,谢谢:)