Hibernate映射异常:逻辑列名不能为空。

9
以下是关于下面的Hibernate映射异常的任何想法。以下是完整的堆栈跟踪,没有信息表明此异常发生在哪个表中。
org.hibernate.MappingException: Logical column name cannot be null
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:179)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:121)
        at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:193)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        at org.jboss.threads.JBossThread.run(JBossThread.java:320)
    Caused by: org.hibernate.MappingException: Logical column name cannot be null
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getPhysicalColumnName(InFlightMetadataCollectorImpl.java:972)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getPhysicalColumnName(InFlightMetadataCollectorImpl.java:966)
        at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:681)
        at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:101)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1786)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1730)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1617)
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
        at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)
        at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:161)
        ... 7 more

欢迎提供关于此异常的根本原因的任何想法。


你能否在这里添加你的领域类和它们的映射,这个错误可能是由于“多对多”关系引起的。 - Rasool Ghafari
@RasoolGhafari 谢谢您的迅速回复。我的项目中有多个实体类之间存在多对多的关系,我无法确定是哪个实体类抛出了这个错误(堆栈跟踪也没有提供实体名)。您有什么建议来确定实体类吗? - raghavan IPS
3个回答

14

我曾经遇到同样的错误,但我已经修复了它。我在文档中发现了这个问题: “许多JPA实现在未为每个@JoinColumn注释指定referencedColumnName时可能会抛出看似不一致的异常,即使所有引用列名都等于参照表中的列名(JPA也需要这样做)。” 为每个JoinColumn添加referencedColumnNames似乎对我有用。

为了帮助缩小给我带来麻烦的类范围,我在org.hibernate.cfg.annotations.TableBinder :: bindFk()中设置了一个断点,在那里他们调用referencedColumn = buildingContext.getMetadataCollector().getPhysicalColumnName(table, referencedColumn); 查找当referencedColumn为空或null时的情况。


感谢@SnoopDougg根据您的指示,我保留了调试点并检查了referencedColumnName何时为空,并为其添加了referenceColumName。 - Niraj

2
与SnoopDougg的答案相同。
另外提供一些信息: 我有一个带有@JoinTable的@ManyToMany,其中包含
  • joinColumns = {2 @Joincolumns}
  • inverseJoinColumns = {2 @Joincolumns}
如果我表达所有4个@JoinColumn而没有任何referencedColumnName ==> OK。
如果我设置一个referencedColumnName ==> 逻辑列名不能为空
解决方案:在所有@JoinColumn上放置referencedColumnName

0

这个异常的根本原因可能是不同的。在我的情况下:

@JoinColumnsOrFormulas(value = {
        @JoinColumnOrFormula(formula = @JoinFormula(value = "null"))
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接