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
Java JPA继承不是干巴巴的_Java_Jpa_Inheritance_Single Table Inheritance - Fatal编程技术网

Java JPA继承不是干巴巴的

Java JPA继承不是干巴巴的,java,jpa,inheritance,single-table-inheritance,Java,Jpa,Inheritance,Single Table Inheritance,我有工作,但不是很干。每一个新的螺栓类型我都必须重复代码。最好展示我的课程,然后进一步解释 BoltSpec的父类(与紧固件有关的尺寸) 和我的EnumBoltType public enum EnumBoltType { CYLINDER_HEAD_CAP_SCREW("CYLINDER HEAD CAP SCREW", EnumHeadType.CYL), HEX_CAP_SCREW("HEX CAP SCREW", EnumHeadType.HEX), HEAVY_

我有工作,但不是很干。每一个新的
螺栓
类型我都必须重复代码。最好展示我的课程,然后进一步解释

BoltSpec
的父类(与紧固件有关的尺寸)

和我的
EnumBoltType

public enum EnumBoltType {
    CYLINDER_HEAD_CAP_SCREW("CYLINDER HEAD CAP SCREW", EnumHeadType.CYL),
    HEX_CAP_SCREW("HEX CAP SCREW", EnumHeadType.HEX),
    HEAVY_HEX_CAP_SCREW("HEAVY HEX CAP SCREW", EnumHeadType.HEX),
    HEX_BOLT("HEX BOLT", EnumHeadType.HEX),
    HEAVY_HEX_BOLT("HEAVY HEX BOLT", EnumHeadType.HEX),
    FLAT_COUNTERSUNK_HEAD_CAP_SCREW("FLAT COUNTERSUNK HEAD CAP SCREW", EnumHeadType.CONE);
然后我必须有重复的类,即
HexCapScrew
heavyExcapscrew
等和
HexCapScrewSpec
heavyExcapscrewspec
等,即使它们具有类似的
BoltSpec
属性(非数值)

这个规格不同

@Entity
@DiscriminatorValue("FLAT_COUNTERSUNK_HEAD_CAP_SCREW")
public class FlatHeadCapScrewSpec extends BoltSpec implements Serializable {
    private static final long serialVersionUID = 1L;

    public FlatHeadCapScrewSpec() {
        super();
    }

    private BigDecimal cone_angle = BigDecimal.ZERO;
    ...
下面是一些import.sql数据示例

insert into BoltSpecs (basic_size, basic_major_diameter, boltType, flat_diameter) 
    values ('2-3/4', '2.75',  'HEX_CAP_SCREW',       '3.988')
    values ('3',     '3',     'HEX_CAP_SCREW',       '4.35')
    values ('3/8',   '0.375', 'HEAVY_HEX_CAP_SCREW', '0.669')

insert into BoltSpecs (basic_size, basic_major_diameter, boltType, cone_angle) 
    values ('2-3/4', '2.75',  'FLAT_COUNTERSUNK_HEAD_CAP_SCREW',       '39.77')
我在前端有一个下拉菜单,用户在其中选择螺栓类型,并需要使用适用的螺栓规格。我不想修改import.sql并放置螺栓头类型。我冒着为
HEX
型螺栓安装
CONE
的风险。是否有一种方法可以执行多个
鉴别器value
s?比如:

@Entity
@DiscriminatorValue("HEX_CAP_SCREW, HEAVY_HEX_CAP_SCREW, HEX_BOLT, HEAVY_HEX_BOLT")
public class BoltSpecHexHead extends BoltSpec implements Serializable {
    private static final long serialVersionUID = 1L;

    public BoltSpecHexHead () {
        super();
    }

    private BigDecimal flat_diameter = BigDecimal.ZERO;


或者如何将EnumHeadType作为鉴别器值ping掉?具有相似头部(EnumHeadType.CYL、HEX和CONE)的螺栓之间的规格相似。

我能够使用
@DiscriminatorFormula

@Entity
@Table(name="BoltSpecs")
@IdClass(BoltSpecCK.class)
//@DiscriminatorColumn(name="boltType" )
@DiscriminatorFormula("case when boltType in ('CYLINDER_HEAD_CAP_SCREW') then 'HEX' 
   when boltType in ('HEX_CAP_SCREW','HEAVY_HEX_CAP_SCREW','HEX_BOLT','HEAVY_HEX_BOLT') then 'HEX' 
   when boltType in ('FLAT_COUNTERSUNK_HEAD_CAP_SCREW') then 'CONE' end")

public abstract class BoltSpec implements Serializable {
为什么不能对所有这些使用相同的类(比如说
Bolt
)?他们看起来很相似,他们有相同的属性,他们的行为会改变吗?如果是这样,那么只需根据实例周围的螺栓类型使用装饰器。

螺栓的规格(螺栓头的尺寸)因螺栓类型而异。boltSpec是bolt的一个属性。所以我需要一个六角头螺栓,一个盘头螺栓,一个带帽螺栓,等等。所以我不知道你到底在问什么,但我用鉴别器公式做了一些事情。
insert into BoltSpecs (basic_size, basic_major_diameter, boltType, flat_diameter) 
    values ('2-3/4', '2.75',  'HEX_CAP_SCREW',       '3.988')
    values ('3',     '3',     'HEX_CAP_SCREW',       '4.35')
    values ('3/8',   '0.375', 'HEAVY_HEX_CAP_SCREW', '0.669')

insert into BoltSpecs (basic_size, basic_major_diameter, boltType, cone_angle) 
    values ('2-3/4', '2.75',  'FLAT_COUNTERSUNK_HEAD_CAP_SCREW',       '39.77')
@Entity
@DiscriminatorValue("HEX_CAP_SCREW, HEAVY_HEX_CAP_SCREW, HEX_BOLT, HEAVY_HEX_BOLT")
public class BoltSpecHexHead extends BoltSpec implements Serializable {
    private static final long serialVersionUID = 1L;

    public BoltSpecHexHead () {
        super();
    }

    private BigDecimal flat_diameter = BigDecimal.ZERO;
public class BoltHexHead extends Bolt {
    private static final long serialVersionUID = 1L;
    private static BoltSpecHexHead spec;
    public BoltSpecHexHead () {
        super(spec);
    }
}
@Entity
@Table(name="BoltSpecs")
@IdClass(BoltSpecCK.class)
//@DiscriminatorColumn(name="boltType" )
@DiscriminatorFormula("case when boltType in ('CYLINDER_HEAD_CAP_SCREW') then 'HEX' 
   when boltType in ('HEX_CAP_SCREW','HEAVY_HEX_CAP_SCREW','HEX_BOLT','HEAVY_HEX_BOLT') then 'HEX' 
   when boltType in ('FLAT_COUNTERSUNK_HEAD_CAP_SCREW') then 'CONE' end")

public abstract class BoltSpec implements Serializable {