JPA实体类关系

时间:2013-06-05 11:09:18

标签: hibernate jpa entity jpa-2.0

我有以下实体类结构

产品类

@Entity
@Table(name = "PRODUCTS")
public class Product implements Serializable{

@Id
private productSlNo;
@Column(name = "PRODUCT_ID")
private String productNo;

ProductDetail class

@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail extends Product implements Serializable {

@Column(name = "PRODUCT_DESC")
private String productDesc;

因为我在Product类中已经有productNo,所以我没有在ProductDetail类中声明它。

我想知道如何在@Id类中使用强制ProductDetail注释,因为Product类中定义了唯一键。否则,这将导致实体没有定义主键属性错误。 productNo是ProductDetail Entity的唯一键

我该如何解决这个问题?任何帮助都非常值得赞赏。

更新1

ProductDetail class

@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail implements Serializable {

@Id
@Column(name = "PRODUCT_ID")
private String productNo;

@Column(name = "PRODUCT_DESC")
private String productDesc;

产品类

@Entity
@Table(name = "PRODUCTS")
public class Product implements Serializable{

@Id
private productSlNo;

@Id
@Column(name = "PRODUCT_ID")
@OneToOne 
@MapsId     
private String productNo;

ProductDetail productDetail;

2 个答案:

答案 0 :(得分:1)

实体继承的默认策略是将每个实体的每个字段存储在同一个表中。因此,您的映射没有意义,因为您在子实体上指定了不同的表。

首先选择要使用的inheritanc策略,然后相应地注释您的类。在the documentation中定义和解释了3种继承策略。

也就是说,如果目标是获得有关此产品的产品和其他详细信息,则不应使用继承,而应使用OneToOne关联。

答案 1 :(得分:1)

产品可以在没有ProductDetail的情况下存在吗?第一次尝试将起作用 - 两个类将共享相同的Product表,ProductDetails使用“PRODUCTDETAILS”作为辅助表。这将允许您拥有Products和ProductDetails,但不能将Product转换为ProductDetail。第二个更新意味着Product必须有一个ProductDetail(当我假设你的意思是它在productDetail属性上时,你的注释是在String上),因为定义的ProductDetail映射并基本上定义了Product的ID。如果产品可以在没有详细信息的情况下存在,您可能需要切换它,以便Product在ProductDetail中使用带有foriegn键的ProductDetail具有双向1:1的双向:

@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail implements Serializable {

    @Id
    @OneToOne
    @JoinColumn(name="PRODUCT_ID")
    private Product product;

    @Column(name = "PRODUCT_DESC")
    private String productDesc;

@Entity
@Table(name = "PRODUCTS")
public class Product implements Serializable{

    @Id
    @Column(name = "PRODUCT_ID")
    private productSlNo;

    @OneToOne(mappedby="product")   
    ProductDetail productDetail;

这将导致ProductDetail从引用的Product中定义“PRODUCT_ID”值。