使用单表继承时出现hibernate错误

时间:2014-11-06 09:40:25

标签: java hibernate

如果我指定

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "tablename")

表示超类,

@Table(name = "tablename")

对于子类,hibernate在应用程序启动期间抛出异常(仅显示最终原因):

Caused by: org.hibernate.AnnotationException: Foreign key circularity dependency involving the following tables: 
at org.hibernate.cfg.Configuration.buildRecursiveOrderedFkSecondPasses(Configuration.java:1570)
at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1511)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1420)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
... 98 more

正如您在上面的示例中所看到的,它没有说明依赖关系循环中涉及哪些表。

如果有人有任何建议可能会有什么问题,我会非常高兴。

1 个答案:

答案 0 :(得分:1)

与此同时,我设法找到了问题。问题简单明了,只有异常消息非常无益。

问题的根源是超类的超类(让我们称之为 baseclass )明确指定为@Inheritance(strategy = InheritanceType.JOINED),因为它只是作为一个公共抽象类对于许多类型的对象。例如,它会指定一个共同的@Id字段,时间戳,诸如此类。

标记为@Entity,因为@Id声明不起作用(并且必须为基类的每个子类指定@Id )。最终的解决方案似乎是我们必须这样做 - 分别为baseclass的每个子类指定id,并且可能为baseclass的非singletable-inherited子类创建一个中间类,以避免大量克隆。

<强>更新 好的解决方案是使用@MappedSuperclass,因此超类不必是@Entity,但是子类可以继承它们的字段和字段的注释,包括@Id。