Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何扩展hibernate注释类以将字段指向不同的hibernate实体?_Java_Hibernate - Fatal编程技术网

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
,谢谢:)