2011-11-22 4 views
4

を上書き私はJPA 1.0を使用して、私は私が何ができるかに制限されていますが、私はまだしかし、私はそれが動作しますカント次のことを行うことが可能であるべきだと思う...休止oneToMany抽象クラスは、ID

Table CustomerA 
    a_id 

Table ProductB 
    a_id 
    b_id 

Table ProductC 
    a_id 
    c_id 

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class AbstractProduct { 

    @Id 
    @GeneratedValue.... 
    private Long id; 

    private String name; 

@ManyToOne() 
JoinColumn(name="a_id") 
private CustomerA customerA; 

} 

今私はオーバーIdに乗るかTable APKに基づく複合キーと派生テーブルのキーを作成することができ、サブクラスを作成したい...

@Entity 
@Table(name="ProductB") 
public class ProductB extends AbstractProduct { 

    //@AttributeOverride(name="id", [email protected](name="B_ID") //Can only be used  with MappedSuperClass and also Emmbedded Objects 
    //@Id //cant override the ID Column so that cant go here 
    //PrimaryKeycolumn join not what i want here 
    private Long productB_id; 

    private String productName; 
} 

@Entity 
@Table(name="CustomerA") 
public class CustomerA 
{ 
    @Id 
    @GeneratedValue.... 
    @Column(name="a_id") 
    private Long aId 

    @OneToMany(mappedBy="customerA", cascade=CascadeType.ALL) 
    private Set<AbstractProduct> product; 
} 

だから、基本的にCustomerA多くの製品を含めることができますしかし、それは常にProductBまたはProductCのいずれかになります。どのようにあなたがattributeoverrideとエンティティを使用するカントとして私は、サブクラスでIdを上書きすることができ、あなたが@Entityを使用する場合は@Entityを指定するたびに@Idを指定する必要があります。私はjpa wikiを読んできましたが、JPA 1.0でこれを実現するにはかなり複雑に見えますが、何か不足しているのだろうかと思います。

答えて

0

私の提案は、あなたが両方の単一方法でそれらを参照できるように、あなたの2つの製品間の基本クラスを共有することです。 JPA/Hibernateでは、Productの共通要素、つまりCustomerAへの参照を含む共有テーブルを作成することを意味します。

あなたはこれを実現することができる方法は、「JOINED」の継承戦略である:

@Inheritance(strategy=InheritanceType.JOINED) 

この戦略を使用することの欠点は、それがすでにAbstractProductベースクラスで使用される既存の「TABLE_PER_CLASS」stategyと衝突することがあります....これはこれに使用するのに適切な基本クラスかもしれませんが。私が覚えていることから、継承戦略を混在させることはできません。ここで

は例です:

@Entity 
@Table(name="CustomerA") 
public class CustomerA 
{ 
    @Id 
    @GeneratedValue.... 
    @Column(name="a_id") 
    private Long aId 

    @OneToMany(mappedBy="customerA", cascade=CascadeType.ALL) 
    private Set<AbstractProduct> product; 
} 

@Entity 
@Table(name="ProductB") 
public class ProductB extends AbstractProduct { 

    private String specificProductBValue; 
} 

@Entity 
@Table(name="ProductC") 
public class ProductC extends AbstractProduct { 

    private String specificProductCValue; 
} 

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class AbstractProduct { 

    @Id 
    @GeneratedValue.... 
    private Long id; 

    private String name; 

    @ManyToOne() 
    JoinColumn(name="customer_id") 
    private CustomerA customerA; 

} 

は、あなたがあなたの例ではほとんどがあるように、ただ正しい継承戦略を使用する必要があるようです。

また、これはあなたのAbstractProduct基本クラスを拡張し、他の製品を持っていないことを前提としています。あなたがそうし、あなたの顧客が参照するものを望まない場合は、ドメインデザインを再考する必要があります。

希望に役立ちます。

関連する問題