Jpa子类映射

时间:2010-06-02 21:07:06

标签: java hibernate orm jpa

我正在制作类似POS的系统。我想知道如何使用JPA映射子类(这是我的DAO)。 Product类包含产品详细信息,OrderProduct类包含有关Product的信息以及有关订单的详细信息。

@Entity
@Table(name="products")
public class Product implements Serializable{
    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.AUTO
    public int getId(){ return id;}

    /**
     Other get/set methods
    */
}

@Entity
@Table(name="order_products")
public class OrderProduct extends Product{
        @Id
        @Column(name="id")
        @GeneratedValue(strategy = GenerationType.AUTO)
        public int getId(){ return id;}

        /**
         Other get/set methods
        */
}

我抱怨重复@Id。但是OrderProduct类真的需要另一个id而不是产品id。我该如何映射?

DB是这样的

Table products
id int
name varchar(32)

Table order_product
id int
quantity int
productid int fk referencing product table

@IdClass@AttributeOverride会有帮助吗?

1 个答案:

答案 0 :(得分:1)

我不认为你想要实现的是JPA和Hibernate都不可能实现的。使用连接子类策略时,子类的PK是基类的PK,用于执行表之间的连接。从JPA规范:

  

2.1.10.3加入子类策略

     

在连接的子类策略中,   类层次结构的根是   由单个表表示。的每个   子类由单独表示   包含那些字段的表   特定于子类(不是   继承自其超类), as   以及代表的列   它的主键。主键   子类表的列服务   作为主键的外键   超类表

您可以使用@PrimaryKeyJoinColumn更改子类中的列名:

@Entity
@PrimaryKeyJoinColumn(name="PRODUCT_ID", referencedColumnName = "ID")
public class OrderProductTop extends ProductTop {
    ...
}

PRODUCT_ID仍然是PK。

说实话,我不了解你的身体模型。对我来说,你目前所代表的是一对多的关系,这是不正确的(它应该是一对一的)。