Java Hibernate中@Embedded类的聚合

Java Hibernate中@Embedded类的聚合,java,hibernate,embeddable,Java,Hibernate,Embeddable,我对这些类有一种情况,第一个类被第二个类包含为@Embedded field,然后第三个类将第二个类包含为两个不同的@Embedded field: @Embeddable public class StorageSize { // ... @Column(nullable = false) private Long size; // ... @Embeddable public class StorageSizeTBPerMonth { // ... @Embedd

我对这些类有一种情况,第一个类被第二个类包含为@Embedded field,然后第三个类将第二个类包含为两个不同的@Embedded field:

@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.checkColumnReplication(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.checkColumnReplication(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中将“大小”替换为“存储”时也是如此


你知道怎么拉这个模型吗?如果可能的话,我会避免创建新实体,并将StorageSize和StorageSizeTBPerMonth都保留为可嵌入类。

StorageSizeTBPerMonth
中没有要覆盖的属性
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元素中使用点(“.”)表示形式来指示嵌入属性中的属性。与点表示法一起使用的每个标识符的值是相应嵌入字段或属性的名称