加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JPA继承不是DRY

发布时间:2020-12-15 02:12:23 所属栏目:Java 来源:网络整理
导读:我有继承工作,但它不是很干.每个新的螺栓类型我都要重复编码.最好展示我的课程,然后进一步解释 我的BoltSpec的父类(与紧固件有关的尺寸) @Entity@Table(name="BoltSpecs")@IdClass(BoltSpecCK.class)@DiscriminatorColumn(name="boltType" )public abstract
我有继承工作,但它不是很干.每个新的螺栓类型我都要重复编码.最好展示我的课程,然后进一步解释

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

@Entity
@Table(name="BoltSpecs")
@IdClass(BoltSpecCK.class)
@DiscriminatorColumn(name="boltType" )
public abstract class BoltSpec implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private String size;

    @Id
    @Enumerated(EnumType.STRING)
    private EnumBoltType boltType;

    private BigDecimal basic_major_diameter = BigDecimal.ZERO;

和我的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",HEX_BOLT("HEX BOLT",HEAVY_HEX_BOLT("HEAVY HEX BOLT",FLAT_COUNTERSUNK_HEAD_CAP_SCREW("FLAT COUNTERSUNK HEAD CAP SCREW",EnumHeadType.CONE);

然后我必须有重复的类,即HexCapScrew,HeavyHexCapScrew等和HexCapScrewSpec,HeavyHexCapScrewSpec等,即使它们具有类似的BoltSpec属性(不是数值)

public class HexCapScrew extends Bolt {
    private static final long serialVersionUID = 1L;
    private static HexCapScrewSpec spec;
    public HexCapScrew() {
        super(spec);
    }
}

public class HeavyHexCapScrew extends Bolt {
    private static final long serialVersionUID = 1L;
    private static HeavyHexCapScrewSpec spec;
    public HeavyHexCapScrew () {
        super(spec);
    }
}

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

    public HexCapScrewSpec() {
        super();
    }

    private BigDecimal flat_diameter = BigDecimal.ZERO;
    ...

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

    public HeavyHexCapScrewSpec() {
        super();
    }

    private BigDecimal flat_diameter = BigDecimal.ZERO;
    ...

这个规格是不同的

@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','4.35')
    values ('3/8','0.375','HEAVY_HEX_CAP_SCREW','0.669')

insert into BoltSpecs (basic_size,cone_angle) 
    values ('2-3/4','FLAT_COUNTERSUNK_HEAD_CAP_SCREW','39.77')

我在前端有一个下拉菜单,用户选择螺栓类型并需要使用适用的螺栓规格.我不想修改我的import.sql并放置螺栓头类型.我冒着将HEE称为HEX型螺栓的风险.有没有办法做多个DiscriminatorValues?喜欢:

@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);
    }
}

或者我如何ping EnumHeadType作为鉴别值?具有相似磁头的螺栓(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','HEX_BOLT','HEAVY_HEX_BOLT') then 'HEX' 
   when boltType in ('FLAT_COUNTERSUNK_HEAD_CAP_SCREW') then 'CONE' end")

public abstract class BoltSpec implements Serializable {

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读