将超类和子类映射到Hibernate中的不同表

时间:2011-02-22 09:43:18

标签: hibernate

我想将一个类映射到一个表,将子类映射到另一个表。我不确定你是否能以正确的方式做到这一点。到目前为止我试过这个:

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "MyTable1")
public class MyClass

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "MyTable2")
public class MySubclass extends MyClass

它有效,但在生成的SQL中,两个表都已连接,我想将它们分开。

另一种方法是使用与上面相同的方法,但将JOINED更改为TABLE_PER_CLASS。这不起作用,因为当我查询 MyClass 时,SQL中的两个表都有UNION ALL。

我还尝试使用@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.IMPLICIT),但没有效果。

所以我的问题是,是否有办法在Hibernate中映射它。有什么建议吗?

谢谢!


使用Hibernate 3.6.1

2 个答案:

答案 0 :(得分:4)

您似乎想要将这两个实体视为完全无关,除了它们共有的字段。它不是真正的继承关系,因为当您搜索MyClass时,您不希望找到MySubclass实例,尽管MySubClass实例是您设计中的MyClass实例。

因此,最佳解决方案可能是使用包含公共字段和方法的MappedSuperclass(参见第2.2.4.4章),并创建两个完全独立的实体来扩展此映射的超类。

答案 1 :(得分:0)

TABLE_PER_CLASS应该做你想做的事。

请注意,当您执行from MyClass m之类的查询时,Hibernate会加载类MyClass的所有对象,包括子类,因此会加载UNION ALL子句。如果您只需要MyClass没有子类,则需要使用以下查询:from MyClass m where m.class = MyClass