java - Hibernate Embedded 类作为 NaturalId

标签 java database hibernate orm entity

我使用 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)

最佳答案

您可以将@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

关于java - Hibernate Embedded 类作为 NaturalId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34455736/

相关文章:

java - 方法执行多次而不是一次

java - 如何将 JSF 语言环境传播到应用程序中的其他层

c# - 用于 Java 或 C# 或 vb.net 的 Sip/VoIP 库

java - 获取网页内容到String很慢

java - JPA:@Embedded 实体如何将自身类型作为字段?

java - Hibernate/JPA 中的一对多关系

java - Hibernate 无法正确级联双向关系

java - 如何在jdk-11中添加外部库?

python - 使用 Tkinter 在 SQLite3 表中插入变量时出现 NameError 和 AttributeError?

mysql - 重用现有产品 ID 作为主键