我正在制作类似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
会有帮助吗?
答案 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。
说实话,我不了解你的身体模型。对我来说,你目前所代表的是一对多的关系,这是不正确的(它应该是一对一的)。