Hibernate/JPA 2.0 - 每个类的表和@EmbeddedId 继承

标签 hibernate inheritance jpa-2.0 hibernate-mapping

我知道 @Embeddable不支持 Hibernate 中的组件继承,我试图找到处理我非常自定义的实体映射的最佳策略。

故事如下:

  • 我有两张 table :prices_a_bprices_a_b_c
  • 我有两个实体映射到每个实体:PriceABPriceABC
  • 这两个表都有复合 PK,只有 prices_a_b_c向 PK
  • 添加一个额外的列

    因此,这将是程序化翻译:
    @Entity
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    public abstract class Price implements Serializable {
      @EmbeddedId
      private AbstractPricePk id;
    
      public AbstractPricePk getId() {
          return id;
      }
    }
    
    @Entity
    @Table(name = "price_a_b")
    @AssociationOverrides(
      { 
        @AssociationOverride(name = "id.a", joinColumns = @JoinColumn(name = "a")),
        @AssociationOverride(name = "id.b", joinColumns = @JoinColumn(name = "b"))
      }
    )
    public class PriceAB extends Price {
      private PriceABPk id;
    
      protected PriceAB() {}
    
      public PriceAB(PriceABPk id) {
        this.id = id;
      }
    
      @Override
      @EmbeddedId
      public PriceABPk getId() {
        return id;
      }
    }
    
    @Entity
    @Table(name = "price_a_b_c")
    @AssociationOverrides(
        { 
            @AssociationOverride(name = "id.a", joinColumns = @JoinColumn(name = "a")),
            @AssociationOverride(name = "id.b", joinColumns = @JoinColumn(name = "b")),
            @AssociationOverride(name = "id.c", joinColumns = @JoinColumn(name = "c"))
        }
    )
    public class PriceABC extends Price {
        private PriceABCPk id;
    
        protected PriceABC() {}
    
        public PriceABC(PriceABCPk id) {
            this.id = id;
        }
    
        @Override
        @EmbeddedId
        public PriceABCPk getId() {
          return id;
        }
    }
    

    这是PKs模型:
    public interface PricePk extends Serializable {
        public A getA();
        public B getB();
    }
    
    @MappedSuperclass
    public abstract class AbstractPricePk implements PricePK {
        @ManyToOne
        @JoinColumn(name = "a")
        private A a;
    
        @ManyToOne
        @JoinColumn(name = "b")
        private B b;
    
        protected AbstractPricePK() { }
    
        public AbstractPricePK(A a, B b) {
            this.a = a;
            this.b = b;
        }
    
        public A getA() {
            return this.a; 
        }
    
        public void setA(A a) {
            this.a = a;
        }
    
        public B getB() {
            return b;
        }
    
        public void setB(B b) {
            this.b = b;
        }
    }
    
    @Embeddable
    public class PriceABPk extends AbstractPricePk {
    
        public PriceABk(A a, B b) {
            super(a,b);
        }
    }
    
    @Embeddable
    public class PriceABCPk extends AbstractPricePk {
        @ManyToOne
        private C c;
    
        public PriceABCPk(A a, B b, C c) {
            super(a, b);
            this.c = c;
        }
    
        public C getC() {
            return b;  
        }
    
        public void setC(C c) {
            this.c = c;
        }
    }
    

    我得到的错误:
    org.hibernate.AnnotationException: PriceABPk must not have @Id properties when used as an @EmbeddedId: PriceAB.id
    

    现在,这一切背后的想法是我想要一个 PriceService可以查询两个表并返回 Price目的。稍后,如果我需要检索 C来自 PriceABC我可以做一个 instanceof ,但大多数时候我需要对两种类型的 Price 执行相同的操作对象。同样,我想要一个 PriceDao这将创建 Price对象取决于我作为参数传递的对象。

    你们认为哪种策略最适合?

    提前致谢!

    最佳答案

    您可以通过在 @EmbeddedId 中用组合替换继承来进行“黑客攻击”

    @Table (name="prices_a_b")
    public class PriceAB extends Price {
    
        @EmbeddedId
        private PriceABId id;
    
        // getters/setters etc.
    }
    
    @Table (name="prices_a_b_c")
    public class PriceABC extends Price {   
        @EmbeddedId
        private PriceABCId id;
    
        @Embeddable 
        class PriceABCId implements Serializable {
                private PriceABId id;
    
                @Column(name="COLUMN_C")
                private C additionalPkPropertyC;
        }
    }
    
    @MappedSuperclass
    public abstract class Price {
        //all common properties go here
    }
    

    关于Hibernate/JPA 2.0 - 每个类的表和@EmbeddedId 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16606474/

    相关文章:

    java - “every class in java extends the MetaClass Object” 是否意味着每个子类都会导致 Diamond 问题

    c++ - 模板实例化不 "do inheritance"

    spring - 在 Grails 服务中回滚事务

    java - struts2 应用程序默认为 error.jsp

    java - 有什么方法可以将多个表中的列合并到单个列表中吗?

    jsf-2 - JSF Image servlet 不加载图像

    Java JPA,如何在不破坏-创建的情况下更新表?

    Hibernate HQL 查询空列

    javascript - 实例化后更新所有同一类型对象的属性

    jpa - 什么时候刷新和清除提交?