Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JPA实体类关系_Hibernate_Jpa_Entity_Jpa 2.0 - Fatal编程技术网

Hibernate JPA实体类关系

Hibernate JPA实体类关系,hibernate,jpa,entity,jpa-2.0,Hibernate,Jpa,Entity,Jpa 2.0,我有以下实体类结构 产品类别 @Entity @Table(name = "PRODUCTS") public class Product implements Serializable{ @Id private productSlNo; @Column(name = "PRODUCT_ID") private String productNo; @Entity @Table(name = "PRODUCTDETAILS") public class ProductDetail extend

我有以下实体类结构

产品类别

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

@Id
private productSlNo;
@Column(name = "PRODUCT_ID")
private String productNo;
@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail extends Product implements Serializable {

@Column(name = "PRODUCT_DESC")
private String productDesc;
@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;
ProductDetail类

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

@Id
private productSlNo;
@Column(name = "PRODUCT_ID")
private String productNo;
@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail extends Product implements Serializable {

@Column(name = "PRODUCT_DESC")
private String productDesc;
@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;
由于我在产品类中已经有了
productNo
,所以我没有在
ProductDetail
类中声明它

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

我怎样才能解决这个问题?任何帮助都是值得赞赏的

更新1

ProductDetail类

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

@Id
private productSlNo;
@Column(name = "PRODUCT_ID")
private String productNo;
@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail extends Product implements Serializable {

@Column(name = "PRODUCT_DESC")
private String productDesc;
@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;
产品类别

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

@Id
private productSlNo;
@Column(name = "PRODUCT_ID")
private String productNo;
@Entity
@Table(name = "PRODUCTDETAILS")
public class ProductDetail extends Product implements Serializable {

@Column(name = "PRODUCT_DESC")
private String productDesc;
@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;

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

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


也就是说,如果目标是拥有一个产品和关于该产品的其他详细信息,那么您不应该使用继承,而应该使用OneToOne关联。

没有ProductDetail的产品可以存在吗?第一次尝试是可行的——这两个类将共享同一个Product表,ProductDetails使用“ProductDetails”作为辅助表。这将允许您拥有产品和ProductDetails,但不能将产品转换为ProductDetail。第二次更新意味着产品必须具有ProductDetail(您的注释位于字符串上,而我假设您的意思是将其置于ProductDetail属性上),因为定义的ProductDetail映射并基本上定义了产品的ID。如果产品可以不带详细信息而存在,则您可能希望切换此选项,因此,该产品与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;


这将导致ProductDetail从引用的产品中提取定义的“PRODUCT_ID”值。

谢谢您的回复。你的意思是说我的映射表是不同的,在
ProductDetail
实体中避免
productNo
是没有意义的?它基本上是我在
PRODUCTDETAILS
表中查找给定
productNo
的详细信息。对于你的第一个问题,不,我不是这么说的。我说过,因为您的(默认)继承策略是单_表,所以为子实体指定一个表没有任何意义。因此,您应该根据文档选择所需的继承策略,并修复映射。对于第二个注释,由于使用了继承,因此定义了is-a关联。你想要的是一种关联:产品有细节。所以你不应该使用继承,而应该使用组合:一个OneTONE关联。我已经修改了我的实体类,并将其作为更新1包含在我的问题中。由于我使用的是共享主键,我的方法正确吗?没有ProductDetail,ThanksChris产品无法存在。基本上ProductDetail只是一个查找表。谢谢