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)
对类进行注释