2011-11-22 53 views
4

我使用JPA 1.0,所以我限制了我能做些什麼,但我仍然認爲這應該是可以做到的。然而,下面我不能得到它的工作...Hibernate的一對多抽象類覆蓋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可以包含很多產品, 但它永遠只能爲ProductBProductC的。我如何可以覆蓋Id在子類中,你不能使用attributeoverride和實體,如果你使用@Entity只要你指定一個@Entity必須指定@Id。我讀過的JPA維基,它看起來相當複雜,OTT在JPA 1.0實現這一點,但我想知道如果我失去了一些東西?

回答

0

我的建議是您分享兩個產品之間的基類,這樣你既可以在一個單一的方式引用它們。在JPA /休眠那意味着創建共享表將包含產品,即參照CustomerA的共同元素。

你可以做到這一點的方法是用「加入了」繼承策略:

@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基類等產品。如果你這樣做,你不想要你的客戶引用的那些,那麼你將不得不重新考慮你的域名設計。

希望有所幫助。