【问题标题】:Inheritance JPA 2.1继承 JPA 2.1
【发布时间】:2014-10-30 03:11:41
【问题描述】:

我得到了这个实体:

@Entity
@Table(name = "PROCESS_VERSION")
public class ProcessVersion implements Serializable {
   private static final long serialVersionUID = 1L;
   private static final String SEQ_NAME = "PROCESS_VERSION_id_SEQ";
   @Id
   @Basic(optional = false)
   @NotNull
   @SequenceGenerator(name = "seq", sequenceName = SEQ_NAME, allocationSize = 1)
   @GeneratedValue(generator = "seq", strategy = GenerationType.SEQUENCE)
   @Column(name = "ID")
   private BigDecimal id;
   @OneToMany(mappedBy = "idProcessVersion", cascade = CascadeType.ALL)
   private List<Stage> stageList;
   @OneToMany(mappedBy = "idProcessVersion", cascade = CascadeType.ALL)
   private List<Kpi> kpiList;

   //Getters and Setters
}

@Entity
@Table(name = "KPI")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(
name="ID_CATEGORY", discriminatorType=DiscriminatorType.INTEGER)
public class Kpi implements Serializable {
   private static final long serialVersionUID = 1L;
   private static final String SEQ_NAME = "KPI_id_SEQ";
   @Id
   @Basic(optional = false)
   @NotNull
   @SequenceGenerator(name = "seq", sequenceName = SEQ_NAME, allocationSize = 1)
   @GeneratedValue(generator = "seq", strategy = GenerationType.SEQUENCE)
   @Column(name = "ID")
   private BigDecimal id;
   @JoinColumn(name = "ID_PROCESS_VERSION", referencedColumnName = "ID")
   @ManyToOne(optional = false)
   private ProcessVersion idProcessVersion;
   @JoinColumn(name = "ID_CATEGORY", referencedColumnName = "ID", insertable = false, updatable =      false)
   @ManyToOne(optional = false)
   private KpiCategory idCategory;

   //Getters and Setters
}

@Entity
@Table(name = "KPI_TEMPORARY")
@DiscriminatorValue("1")
public class KpiTemporary  extends Kpi implements Serializable {
   private static final long serialVersionUID = 1L;
   @JoinColumn(name = "ID_STAGE_SOURCE", referencedColumnName = "ID")
   @ManyToOne(optional = false)
   private Stage idStageSource;
   @JoinColumn(name = "ID_STAGE_TARGET", referencedColumnName = "ID")
   @ManyToOne(optional = false)
   private Stage idStageTarget;

   //Getters and Setters
}

@Entity
@Table(name = "KPI_COUNTER")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorValue(KpiCategory.CATEGORY_COUNTER)
public class KpiCounter extends Kpi implements Serializable {
   private static final long serialVersionUID = 1L;
   @JoinColumn(name = "ID_STAGE", referencedColumnName = "ID")
   @ManyToOne(optional = false)
   private Stage idStage;

   //Getters and Setters
}

当我尝试从 ProcessVersion 获取 kpis 列表时,我总是得到 0。我检查了 hibernate 生成的 sql,我看到这个句子非常奇怪:

select kpilist0_.ID_PROCESS_VERSION as ID_PROCESS_VERSION5_14_0_, kpilist0_.ID as ID2_5_0_, 
kpilist0_.ID as ID2_5_1_, kpilist0_.DESCRIPTION as DESCRIPTION3_5_1_, 
kpilist0_.ID_CATEGORY as ID_CATEGORY1_5_1_, kpilist0_.ID_PROCESS_VERSION as     ID_PROCESS_VERSION5_5_1_, 
kpilist0_.NAME as NAME4_5_1_, 
kpilist0_2_.ID_STAGE as ID_STAGE2_7_1_, 
kpilist0_3_.ID_STAGE_SOURCE as ID_STAGE_SOURCE2_9_1_, kpilist0_3_.ID_STAGE_TARGET as    ID_STAGE_TARGET3_9_1_, 
kpicategor1_.ID as ID1_6_2_, kpicategor1_.NAME as NAME2_6_2_, 
stage2_.ID as ID1_15_3_, stage2_.DESCRIPTION as DESCRIPTION2_15_3_, 
stage2_.ID_PROCESS_VERSION as ID_PROCESS_VERSION5_15_3_, 
stage2_.ID_RESPONSABLY as ID_RESPONSABLY6_15_3_, stage2_.ID_STAGE as ID_STAGE3_15_3_, 
stage2_.NAME as NAME4_15_3_, processver3_.ID as ID1_14_4_,
stage10_.ID as ID1_15_11_, stage10_.DESCRIPTION as DESCRIPTION2_15_11_, 
stage10_.ID_PROCESS_VERSION as ID_PROCESS_VERSION5_15_11_, stage10_.ID_RESPONSABLY as    ID_RESPONSABLY6_15_11_, 
stage10_.ID_STAGE as ID_STAGE3_15_11_, stage10_.NAME as NAME4_15_11_, stage11_.ID as ID1_15_12_, 
stage11_.DESCRIPTION as DESCRIPTION2_15_12_, stage11_.ID_PROCESS_VERSION as ID_PROCESS_VERSION5_15_12_, 
stage11_.ID_RESPONSABLY as ID_RESPONSABLY6_15_12_, stage11_.ID_STAGE as ID_STAGE3_15_12_, 
stage11_.NAME as NAME4_15_12_ 

from KPI kpilist0_  
left outer join KPI_COUNTER kpilist0_2_ on kpilist0_.ID=kpilist0_2_.ID 
left outer join KPI_TEMPORARY kpilist0_3_ on kpilist0_.ID=kpilist0_3_.ID 
inner join KPI_CATEGORY kpicategor1_ on kpilist0_.ID_CATEGORY=kpicategor1_.ID 
inner join STAGE stage2_ on kpilist0_3_.ID_STAGE_SOURCE=stage2_.ID 
left outer join PROCESS_VERSION processver3_ on stage2_.ID_PROCESS_VERSION=processver3_.ID 
inner join STAGE stage10_ on kpilist0_3_.ID_STAGE_TARGET=stage10_.ID 
inner join STAGE stage11_ on kpilist0_2_.ID_STAGE=stage11_.ID 

where kpilist0_.ID_PROCESS_VERSION=?;

问题是为什么句子有 3 个内部阶段..两个来自 KpiTemporary 和一个来自 KpiCounter 问题是这永远不会有 3 个值,因为 kpi 是临时的或者是计数器但不是两者。

谁能告诉我一些事情?是否有任何额外的配置要应用。我正在使用带有 hinerbate 4.3.5.Final 的 JPA 2.1 规范

【问题讨论】:

    标签: sql hibernate jpa persistence


    【解决方案1】:

    问题是你有 3 个映射:

    @ManyToOne(optional = false)
    

    在柜台和临时。 false 意味着映射是 1..M -> 1,而 true 意味着映射是 0..M ->1,我想你会想要后者。将它们更改为 true ,看看你是否得到了你想要的 sql。

    【讨论】:

    • 感谢你完成了这项工作
    猜你喜欢
    • 2011-08-20
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2018-09-15
    • 2019-01-12
    相关资源
    最近更新 更多