JPA Inheritance is NOT DRY

I have an inheritance job, but it’s not very DRY. Each new type boltmust repeat the code. It’s best to show my classes and then explain further

My parent class is for BoltSpec(Dimensions related to fasteners)

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

and mine 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);

Then I need to have repeating classes, i.e. HexCapScrew, HeavyHexCapScrewetc. and HexCapScrewSpec, HeavyHexCapScrewSpecetc., although they have similar BoltSpecproperties (non-numerical values)

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;
    ...

this specification is different

@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;
    ...

Here are some examples of import.sql data

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 . CONE HEX. DiscriminatorValue 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;

...

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

EnumHeadType ? (EnumHeadType.CYL, HEX CONE)

+4
2

, @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 {
0

( Bolt) ? , , ? , .

0

Source: https://habr.com/ru/post/1623341/


All Articles