gpt4 book ai didi

java - 如何扩展 Hibernate 带注释的类以将字段指向不同的 Hibernate 实体?

转载 作者:行者123 更新时间:2023-11-30 05:02:07 25 4
gpt4 key购买 nike

假设我有以下类结构:

/** 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 中也应该显示为 FooBar 对象。最重要的是,在处理复制对象时,表之间的关系应该是在复制的表之间。

最正确的方法是什么?

我猜我可能可以做这样的事情:

@Entity
@Table(name = "OtherFoo")
public class OtherFoo extends Foo {
@JoinColumn(name = "id")
private OtherBar bar;
}

@Entity
@Table(name = "OtherBar")
public class OtherBar extends Bar {
}

但是这是正确的做法吗?

最佳答案

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

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

关于java - 如何扩展 Hibernate 带注释的类以将字段指向不同的 Hibernate 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6338660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com