2011-11-22 25 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基类等产品。如果你这样做,你不想要你的客户引用的那些,那么你将不得不重新考虑你的域名设计。

希望有所帮助。