Hibernate oneToMany 抽象类覆盖 ID

5

我正在使用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或者基于Table APK和派生表的键创建组合键...

@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;
} 

因此,CustomerA 可以包含许多产品,但始终只能是 ProductBProductC 中的一个。如果您不能使用 attributeoverride 和实体类来覆盖子类中的 Id ,那该怎么办呢?如果您使用 @Entity ,则必须在指定 @Entity 时指定 @Id 。我已经阅读了 JPA wiki,并且看起来在 JPA 1.0 中实现这一点相当复杂和繁琐,但我想知道是否有什么遗漏?
1个回答

0
我的建议是在你的两个产品之间共享一个基类,这样你就可以用一种方式引用它们。在JPA/Hibernate中,这意味着创建一个共享表,其中包含你的产品的公共元素,即对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基类。如果您有并且不希望客户引用它们,则必须重新考虑您的域设计。

希望能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接