如果我指定
@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
正如您在上面的示例中所看到的,它没有说明依赖关系循环中涉及哪些表。
如果有人有任何建议可能会有什么问题,我会非常高兴。
答案 0 :(得分:1)
与此同时,我设法找到了问题。问题简单明了,只有异常消息非常无益。
问题的根源是超类的超类(让我们称之为 baseclass )明确指定为@Inheritance(strategy = InheritanceType.JOINED)
,因为它只是作为一个公共抽象类对于许多类型的对象。例如,它会指定一个共同的@Id
字段,时间戳,诸如此类。
将标记为@Entity
,因为@Id
声明不起作用(并且必须为基类的每个子类指定@Id
)。最终的解决方案似乎是我们必须这样做 - 分别为baseclass的每个子类指定id,并且可能为baseclass的非singletable-inherited子类创建一个中间类,以避免大量克隆。
<强>更新强>
好的解决方案是使用@MappedSuperclass
,因此超类不必是@Entity,但是子类可以继承它们的字段和字段的注释,包括@Id。