0

我有以下实体类结构

产品类别

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

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

ProductDetail类

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

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

正如我已经productNo在 Product 类中一样,我没有在ProductDetail类中声明它。

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

我该如何解决这个问题?任何帮助都是非常可观的。

更新 1

ProductDetail类

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

2 回答 2

1

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

@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_ID”值。

于 2013-06-05T14:33:32.407 回答
1

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

首先选择您要使用的继承策略,然后相应地注释您的类。文档中定义并解释了 3 种继承策略。

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

于 2013-06-05T11:15:56.393 回答