Hibernate oneToMany抽象类覆盖ID

时间:2011-11-22 20:34:13

标签: hibernate

我正在使用JPA 1.0,因此我可以做的事情受到限制,但我仍然认为应该可以执行以下操作,但是我无法让它工作......

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的子类,或者根据PK的{​​{1}}和派生表的键创建一个复合键... < / p>

Table A

基本上@Entity @Table(name="ProductB") public class ProductB extends AbstractProduct { //@AttributeOverride(name="id", column=@Column(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; } 可以包含许多产品,但它始终只有CustomerAProductB。如果您无法使用ProductC和实体,我如何覆盖子类中的Id?如果您使用attributeoverride,则必须在指定@Entity时指定@Id }。我已经阅读了jpa wiki并且它看起来相当复杂并且在JPA 1.0中实现了这一点,但是我想知道我是否遗漏了什么?

1 个答案:

答案 0 :(得分:0)

我的建议是在两种产品之间共享基类,以便您可以以单一方式引用它们。在JPA / Hibernate中,这意味着创建一个包含Product的公共元素的共享表,即对CustomerA的引用。

您可以通过'JOINED'继承策略来实现这一目标:

@Inheritance(strategy=InheritanceType.JOINED)

使用此策略的缺点是它可能与您在AbstractProduct基类中已经使用的现有“TABLE_PER_CLASS”状态发生冲突....尽管这可能是适用于此的基类。从我记忆中,你不能混合继承策略。

以下是一个例子:

@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基类。如果您这样做而且您不想要客户引用的那些,那么您将不得不重新考虑您的域设计。

希望有所帮助。