Hibernate でのコンポーネントの継承がサポートされていないことを認識して@Embeddable
いるので、非常にカスタムなエンティティ マッピングを処理するための最良の戦略を見つけようとしています。
話は次のとおりです。
私は2つのテーブルを持っています
prices_a_b
:prices_a_b_c
それぞれにマッピングされた 2 つのエンティティがあります
PriceAB
。PriceABC
これらの両方のテーブルには
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
後で から取得する必要がある場合は、C
をPriceABC
実行するだけで済みますinstanceof
が、ほとんどの場合、両方のタイプのPrice
オブジェクトに対して同じ操作を実行する必要があります。同様に、パラメータとして渡すオブジェクトに応じてオブジェクトをPriceDao
作成する が必要です。Price
皆さんは、どの戦略が最も適していると思いますか?
前もって感謝します!