java - 如何在 hibernate 中使用复合 PK 为 JOINED 继承设置注释?

标签 java hibernate jpa hibernate-mapping hibernate-annotations

我是 hibernate 的新手,在尝试用复合主键 设置Joined inheritance 时遇到了困难。使用我当前的设置,我得到:

JDBCException: 无法插入:LandHolidayPackage

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

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

数据库设计: HolidayPackageVariants db design image

Reference

这是我的类(class)和涉及的注释:

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

最佳答案

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

关于java - 如何在 hibernate 中使用复合 PK 为 JOINED 继承设置注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903288/

相关文章:

java - Java线程依赖

java - Bukkit API软依赖导入

hibernate - Spring Data @Query 与 Pageable 和 Sort 不排序

java - 是否允许在一个 Criteria 内多次使用相同的 DetachedCriteria?

hibernate - 简单的 H2 和 hibernate/JPA

mysql - 无状态 Bean 无法持久化简单实体

java - JPA/Hibernate - InheritanceType.JOINED 的行为类似于 InheritanceType.TABLE_PER_CLASS

java - 扩展PowerMockRunner并设置公共(public)静态字段

java - 从文件获取输入

hibernate - 查询以删除表中的所有行 hibernate