4

Hibernate でのコンポーネントの継承がサポートされていないことを認識して@Embeddableいるので、非常にカスタムなエンティティ マッピングを処理するための最良の戦略を見つけようとしています。

話は次のとおりです。

  • 私は2つのテーブルを持っていますprices_a_b:prices_a_b_c

  • それぞれにマッピングされた 2 つのエンティティがありますPriceABPriceABC

  • これらの両方のテーブルにはprices_a_b_c、PK に追加の列を追加する複合 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;
    }
}

PK モデルは次のとおりです。

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後で から取得する必要がある場合は、CPriceABC実行するだけで済みますinstanceofが、ほとんどの場合、両方のタイプのPriceオブジェクトに対して同じ操作を実行する必要があります。同様に、パラメータとして渡すオブジェクトに応じてオブジェクトをPriceDao作成する が必要です。Price

皆さんは、どの戦略が最も適していると思いますか?

前もって感謝します!

4

1 に答える 1

0

@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
}
于 2013-05-20T07:32:48.257 に答える