【问题标题】:JPA Entity class RelationshipJPA 实体类关系
【发布时间】:2013-06-01 01:26:33
【问题描述】:

我有以下Entity类结构

产品类别

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

由于我在 Product 类中已经有 productNo,因此我没有在 ProductDetail 类中声明它。

我想知道如何在ProductDetail 类中拥有强制性的@Id 注释,因为唯一键是在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;

【问题讨论】:

    标签: hibernate jpa entity jpa-2.0


    【解决方案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”值。

    【讨论】:

    • Chris Product 不能存在于 ProductDetail 中。基本上 ProductDetail 只不过是一个查找表。谢谢
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复。你的意思是说我的映射表不一样,在ProductDetail Entity中避开productNo没有意义?
    • 它基本上是我在PRODUCTDETAILS 表中的查找信息,我在其中查找给定productNo 的详细信息
    • 第一个问题,不,我不是这么说的。我说过,由于您的(默认)继承策略是 SINGLE_TABLE,因此为子实体指定表没有任何意义。因此,您应该根据文档选择所需的继承策略,并修复映射。对于您的第二条评论,由于您使用继承,因此您定义了一个 is-a 关联。你想要的是一个有关联:一个产品有细节。所以你不应该使用继承,而是使用组合:OneToOne 关联。
    • 我已经修改了我的实体类并作为更新 1 包含在我的问题中。当我使用共享主键时,我的方法是否正确?谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2021-05-22
    • 2013-04-25
    • 2011-02-14
    • 2014-02-16
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多