2014-11-06 65 views
1

如果我指定休眠错误单个表继承

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

为超类,和

@Table(name = "tablename") 

,休眠抛出(仅显示最终原因)在应用程序启动一个异常:

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 

正如你在上面的例子中看到的,它并没有说明哪些表是involv在依赖关系循环中编辑。

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

+0

您是否正确定义了鉴别器? – Dmytro 2014-11-06 10:00:07

+0

如果我定义它没关系,错误不会改变。 – 2014-11-06 10:12:01

+0

你可以在这里发布你的实体吗? – RE350 2014-11-06 12:12:39

回答

1

同时,我设法找到了问题。问题很简单直接,只有例外的信息非常无益。

问题的根源是,有超类的超类(可以称之为基类)作为原打算只是作为一个多对多的对象类型的常见抽象类,被明确指定为@Inheritance(strategy = InheritanceType.JOINED)。例如,它会指定一个通用的@Id字段,时间戳,什么。

被标记为@Entity@Id声明不会否则工作(并必须指定基类的每个子类一个@Id)。最终的解决方案似乎是我们必须这样做 - 为每个基类的子类分别指定id,也许为基类的非单个表继承的子类创建一个中间类,以避免大量的克隆。

更新: 的很好的解决方案是使用@MappedSuperclass,所以超不必是@Entity,但子类可以继承各自的领域和领域的注释,包括@Id。