java - Hibernate 中 @Embedded 类的聚合

标签 java hibernate embeddable

我遇到了这些类的情况,其中第一个类被第二个类包含为 @Embedded 字段,然后第三个类包含第二个类两次作为两个不同的 @Embedded 字段:

@Embeddable
public class StorageSize {
  // ...
  @Column(nullable = false)
  private Long size;
  // ...


@Embeddable
public class StorageSizeTBPerMonth {
  // ...
  @Embedded
  private StorageSize storage = new StorageSize();
  // ...


@Entity
public class StorageRange {
  // ...
  @Embedded
  @AttributeOverrides({ @AttributeOverride(name = "size", column = @Column(name ="storage_low")) })
  private StorageSizeTBPerMonth limitLow;
  // ...
  @Embedded
  @AttributeOverrides({ @AttributeOverride(name = "size", column = @Column(name = "storage_high")) })
  private StorageSizeTBPerMonth limitHigh;

当我尝试使用上面的类运行代码时,出现异常

引起原因:org.hibernate.MappingException:实体映射中的重复列:com.mycompany.data.model.StorageRange列:大小(应使用 insert="false"update="false"进行映射) 在 org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:676) 在 org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:698) 在 org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:694) 在 org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:694) 在 org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:720) 在 org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:474) 在 org.hibernate.mapping.RootClass.validate(RootClass.java:236) 在 org.hibernate.cfg.Configuration.validate(Configuration.java:1193) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1378) 在 org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) 在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:892) ... 24 更多

当我在@AttributeOverride中用“storage”替换“size”时,情况是一样的。

知道如何提取这样的模型吗?如果可能的话,我会避免创建新实体并将 StorageSize 和 StorageSizeTBPerMonth 保留为可嵌入类。

最佳答案

StorageSizeTBPerMonth 中没有要覆盖的属性 size。它确实有嵌入字段storage,其中包含属性size。这就是为什么 storage.size 是可行的方法:

@Embedded
  @AttributeOverrides({ @AttributeOverride(name = "storage.size", column = @Column(name ="storage_low")) })
  private StorageSizeTBPerMonth limitLow;
  // ...
  @Embedded
  @AttributeOverrides({ @AttributeOverride(name = "storage.size", column = @Column(name = "storage_high")) })
  private StorageSizeTBPerMonth limitHigh;

在 JPA 2.0 规范中,这是用以下文字来说明的:

要覆盖多个嵌入级别的映射,必须在 name 元素中使用点(“.”)表示法来指示嵌入属性内的属性。与点符号一起使用的每个标识符的值是相应嵌入字段或属性的名称。

关于java - Hibernate 中 @Embedded 类的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21384768/

相关文章:

java - 我可以通过这种方式传递列名吗?

java - Spring 3 应用程序中 Hibernate @SequenceGenerator 的问题

java - 自动生成的 id 未级联在 Hibernate 子实体中的 EmbeddedId 上

java - Hibernate @Embeddable 类对于未引用的列抛出 "SQLServerException: Invalid column name"

java - 跟踪 "hidden"异常

java - Scala:继承接口(interface)成员初始化

java - ListView复选框位于文本之上,如何填充文本并强制复选框标准颜色?

java - hibernate 搜索(Lucene + hibernate 核心)如何工作?

spring - Hibernate 4.3 到 5.2 升级 - 不能同时取多个包

c - ANSI C 的可嵌入 VM 运行时