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 Spring JPA存储库条件重载列实现_Hibernate_Jpa_Hibernate Mapping - Fatal编程技术网

Hibernate Spring JPA存储库条件重载列实现

Hibernate Spring JPA存储库条件重载列实现,hibernate,jpa,hibernate-mapping,Hibernate,Jpa,Hibernate Mapping,我在这里有一部分数据库,简化了问题: Supplier company_id int location String Warehouse warehouse_id int location String Store store_id int location String Shipment shipment_id int origin_id int destination_id

我在这里有一部分数据库,简化了问题:

Supplier
  company_id    int
  location      String

Warehouse
  warehouse_id  int
  location      String

Store
  store_id      int
  location      String

Shipment
  shipment_id      int
  origin_id        int
  destination_id   int
目标:该系统用于记录和跟踪供应商和仓库之间、仓库和商店之间以及商店之间的发货情况

最初我计划通过创建3个表来实现这一点,每个表存储一种类型的装运,但我意识到我可以通过创建一个名为装运的表来抽象这一点,因为所有可能的来源和目的地都具有相同的ID长度和类型(int)。我使用shipping.type来标识原产地是供应商、仓库还是商店,反之亦然,使用dest_类型。我的问题是如何在JPA实体中实现这一点?我当前的伪代码如下所示:

@Entity
@Table(name = "SHIPMENT")
public class Shipment implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "SHIPMENT_ID")
    private int shipmentId;

    @Column(name = "ORIGIN_TYPE")
    private int originType;

    @Column(name = "DESTINATION_TYPE")
    private int destination_id;

    if(origin_type==1){
        @ManyToOne
        @JoinColumn(name = "ORIGIN_ID", nullable = false)
        private Supplier supplier;
    }
    else if(origin_type==2){
        @ManyToOne
        @JoinColumn(name = "ORIGIN_ID", nullable = false)
        private Warehouse warehouse;
    }
    else if(origin_type==3){
        @ManyToOne
        @JoinColumn(name = "ORIGIN_ID", nullable = false)
        private Store store;
    }
//same for destinations
}

我不知道这是否可能?我不知道要搜索什么关键字来实现这一点,因为我在自学。

这种情况可以通过
继承映射的
表/class
来处理

“每类表”策略将每个实体映射到其表,该表包含实体的所有属性,包括继承的属性

您需要将
供应商
仓库
存储
类作为
装运
的子类,并对
装运
类使用
@inherance
注释,如下所示

@Entity
@Table(name = "SHIPMENT")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Shipment implements Serializable
这就是一个例子

编辑的Anwer

事实上,你的案子基本上符合

为此,您需要将继承类型更改为
@heritance(strategy=heritancetype.JOINED)