【问题标题】:How do I setup annotations for JOINED inheritance with composite PK in hibernate?如何在休眠中使用复合 PK 为 JOINED 继承设置注释?
【发布时间】:2012-04-11 19:06:17
【问题描述】:

我是 hibernate 的新手,在尝试使用 composite Primary Key 设置 Joined inheritance 时遇到了困难。使用我当前的设置,我得到:

JDBCException:无法插入:LandHolidayPackage

我本质上是在寻找两件事:

  • 继承注释到位了吗?
  • 复合 PK 设置是否正确?

数据库设计:

Reference

这是我的课程和所涉及的注释:

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

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping hibernate-annotations


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2013-02-13
      • 2012-07-15
      相关资源
      最近更新 更多