Java 如何在hibernate中为具有复合PK的联合继承设置注释?

Java 如何在hibernate中为具有复合PK的联合继承设置注释?,java,hibernate,jpa,hibernate-mapping,hibernate-annotations,Java,Hibernate,Jpa,Hibernate Mapping,Hibernate Annotations,我刚开始休眠,很难用复合主键设置联合继承。使用当前设置,我可以获得: JDBCException:无法插入:LandHolidayPackage 我基本上在寻找两件事: 继承注释是否到位 复合PK设置是否正确 数据库设计: 以下是我的类和涉及的注释: @Entity @Table(name = "HOLIDAYPACKAGE") public final class HolidayPackage { private Integer idPackage; private S

我刚开始休眠,很难用
复合主键设置
联合继承
。使用当前设置,我可以获得:

JDBCException:无法插入:LandHolidayPackage

我基本上在寻找两件事:

  • 继承注释是否到位
  • 复合PK设置是否正确
数据库设计:

以下是我的类和涉及的注释:

@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
    }
@实体
@表(name=“HOLIDAYPACKAGE”)
公共期末班度假套餐{
私有整数idPackage;
私有字符串名称;
私有集holidayPackageVariants=新哈希集(0);
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“IDHOLIDAYPACKAGE”,null=false)
公共整数getIdPackage(){
返回idPackage;
}
@OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.ALL},mappedBy=“holidayPackage”)
公共集getHolidayPackageVariants(){
返回度假包变体;
}
//修改了代码的其他部分
}
@实体
@继承(策略=InheritanceType.JOINED)
@表(name=“HOLIDAYPACKAGEVARIANT”)
公共抽象类HolidayPackageVariant{
私有整数idHolidayPackageVariant;
私人度假套餐;
私有字符串类型HolidayPackage;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“IDHOLIDAYPACKAGEVARIANT”,null=false)
公共整数getIdHolidayPackageVariant(){
返回idHolidayPackageVariant;
}
@manytone(fetch=FetchType.LAZY,cascade={CascadeType.ALL})
@JoinColumn(name=“IDHOLIDAYPACKAGE”,nullable=false)
公共假期套餐getHolidayPackage(){
返回度假套餐;
}
@列(name=“TYPEHOLIDAYPACKAGE”,null=true)
公共字符串getTypeHolidayPackage(){
返回式度假套餐;
}
//ommitted setter,等于hashCode
}
@实体
@表(name=“LANDHOLIDAYPACKAGEVARIANT”)
公共最终类LandHolidayPackageVariant扩展了HolidayPackageVariant{
私有静态最终字符串LAND=“LAND”;
受保护的LandHolidayPackageVariant(){}
公共土地度假套餐变体(度假套餐度假套餐){
超级(度假套餐、土地);
}
}
@实体
@表(name=“FLIGHTHOLIDAYPACKAGEVARIANT”)
公共最终类FlightHolidayPackageVariant扩展了HolidayPackageVariant{
私人静态最终字符串FLIGHT=“FLIGHT”;
私人目的地起源;
受保护的FlightHolidayPackageVariant(){}
公共航班HolidayPackage变体(HolidayPackage HolidayPackage,
目的地(原籍){
超级(度假套餐、航班);
原始性(原始性);
}
@manytone(fetch=FetchType.LAZY,cascade={CascadeType.ALL})
@JoinColumn(name=“IDDESTINATION”,nullable=false)
公共目的地getOriginCity(){
回归原点;
}
//使用其他设置器等功能
}

您注释了属性而不是字段。默认情况下,JPA尝试访问这些字段。如果希望JPA使用字段,则必须使用
@AccessType(AccessType.Field)

注释类,而不是字段。默认情况下,JPA尝试访问这些字段。如果希望JPA使用字段,则必须使用
@AccessType(AccessType.Field)
对类进行注释