我有以下实体类结构
产品类
@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;
答案 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”值。