【问题标题】:Hibernate Embedded class as NaturalIdHibernate Embedded 类作为 NaturalId
【发布时间】:2016-03-31 01:44:21
【问题描述】:

我使用 Hibernate 4.1。
我在Sanad 中有一个实体Sanad 和一个嵌入式类Gas

@Entity
public class Sanad{
  @Id
  private int id;

  @NaturalId
  @Embedded
  Gas gas;
}


@Embeddable
@AttributeOverrides({ 
     @AttributeOverride(name = "gate", column = @Column(name = "gate")),
     @AttributeOverride(name = "serial", column = @Column(name = "serial"))
})
public class Gas{
  int gate;
  String serial;
}

我希望 Sanad 中的 gas 字段为 NaturalId。我该怎么做?
当我在Sanad 的气场上方使用@NaturalId 时,我在部署时遇到了这个异常:

Caused by: org.hibernate.MappingException: Unable to find logical column name from physical name gas in table Sanad
at org.hibernate.cfg.Configuration$MappingsImpl.getLogicalColumnName(Configuration.java:3258)
at org.hibernate.cfg.IndexOrUniqueKeySecondPass.doSecondPass(IndexOrUniqueKeySecondPass.java:83)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1695)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:439)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)

【问题讨论】:

    标签: java database hibernate orm entity


    【解决方案1】:

    您可以将@NaturalId 注解添加到嵌入对象,如下所示:

    @Entity
    public class Sanad{
      @Id
      private int id;
    
      @NaturalId
      @Embedded
      @AttributeOverrides({ 
         @AttributeOverride(name = "gate", column = @Column(name = "gate")),
         @AttributeOverride(name = "serial", column = @Column(name = "serial"))
      })
      Gas gas;
    }
    
    @Embeddable
    public class Gas{
      @Column(name = "gate")
      int gate;
      @Column(name = "serial")
      String serial;
    }
    

    请看这里的例子:

    https://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html/ch07.html

    【讨论】:

    • 谢谢约翰。但是这个例外你怎么办:无法从表Sanad中的物理名称gas中找到逻辑列名称
    • 你发的指南是关于hibernate 5.0的
    • 属性覆盖需要进入Entity类
    • 你在数据库中的列名是什么?
    【解决方案2】:

    我认为这个问题与这个 Hibernate 错误中报告的问题相同

    https://hibernate.atlassian.net/browse/HHH-4249

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多