简体   繁体   中英

How do I setup annotations for JOINED inheritance with composite PK in hibernate?

I am new to hibernate and having a tough time trying to wrap my head around setting up Joined inheritance with composite Primary Key . With my current setup, I get a:

JDBCException: could not insert: LandHolidayPackage

I am essentially looking for two things:

  • Are the inheritance annotations in place ?
  • Is the composite PK setup properly ?

DB Design: HolidayPackageVariants数据库设计图像

Reference

Here are my classes and the annotations involved:

@Entity
@Table(name = "HOLIDAYPACKAGE")
public final class HolidayPackage {
    private Integer idPackage;
    private String name;

    private Set<HolidayPackageVariant> holidayPackageVariants = new HashSet<HolidayPackageVariant>(0);

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "IDHOLIDAYPACKAGE", nullable = false)
    public Integer getIdPackage() {
        return idPackage;
    }

    @OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, mappedBy = "holidayPackage")
    public Set<HolidayPackageVariant> getHolidayPackageVariants() {
        return holidayPackageVariants;
    }

    // ommitted other part of the code
    }

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="HOLIDAYPACKAGEVARIANT")
public abstract class HolidayPackageVariant {
    private Integer idHolidayPackageVariant;
    private HolidayPackage holidayPackage;
    private String typeHolidayPackage;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="IDHOLIDAYPACKAGEVARIANT", nullable=false)
    public Integer getIdHolidayPackageVariant() {
        return idHolidayPackageVariant;
    }

    @ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
    @JoinColumn(name="IDHOLIDAYPACKAGE", nullable=false)
    public HolidayPackage getHolidayPackage() {
        return holidayPackage;
    }

    @Column(name="TYPEHOLIDAYPACKAGE", nullable=true)
    public String getTypeHolidayPackage() {
        return typeHolidayPackage;
    }

    // ommitted setters, equals hashCode
    }

@Entity
@Table(name="LANDHOLIDAYPACKAGEVARIANT")
public final class LandHolidayPackageVariant extends HolidayPackageVariant{
    private static final String LAND = "LAND";

    protected LandHolidayPackageVariant() {}

    public LandHolidayPackageVariant(HolidayPackage holidayPackage) {
        super(holidayPackage, LAND);
    }
    }

@Entity
@Table(name="FLIGHTHOLIDAYPACKAGEVARIANT")
public final class FlightHolidayPackageVariant extends HolidayPackageVariant{
    private static final String FLIGHT = "FLIGHT";
    private Destination originCity;

    protected FlightHolidayPackageVariant(){}

    public FlightHolidayPackageVariant(HolidayPackage holidayPackage,
            Destination originCity) {
        super(holidayPackage, FLIGHT);
        setOriginCity(originCity);
    }

    @ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
    @JoinColumn(name="IDDESTINATION", nullable=false)
    public Destination getOriginCity() {
        return originCity;
    }

    // ommited other setters etc functions
    }

You annotated the properties in stead of the fields. JPA by default tries to access the fields. If you want JPA to use the fields you have to annotate the class with @AccessType(AccessType.Field) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM