休眠与超类的一对多关系

时间:2020-10-13 09:06:42

标签: java hibernate jpa persistence

我们有一个模型,用于存储基本异常(超类)数据与详细异常数据(每种异常类型一个类)分开存储。 每个详细信息异常类都继承自基本异常。

现在,我们要创建一个新的详细异常类(specialException),该类具有一对多关系来存储属性。

我们按如下所述创建了模型,但是休眠似乎无法将生成的id从超类传播到属性类,从而导致错误:

ORA-01400: Einfügen von NULL in ("EXCEPT_SPECIAL_ATTR"."EXCEPTIONID") nicht möglich

当我们尝试插入新的异常时,我们希望hibernate自动将SpecialExceptionAttribute.specialException.exceptionid映射到SpecialException.exceptionid(由异常类中的序列生成器传播)。

这可能吗?

这是我们的模型:

ExceptionTable <- one to one -> SpecialExceptionTable <- one to many -> SpecialExceptionAttributeTable

代码:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "EXCEPTIONS")
@XmlRootElement
public class Exception implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "exception_id_sequence")
    @SequenceGenerator(name = "exception_id_sequence", sequenceName = "SEQ_EDM_EXCEPTIONS_ID", allocationSize = 1)
    private BigDecimal id;
    [...]
}


@Entity
@PrimaryKeyJoinColumn(name = "exceptionid")
@Table(name = "EXCEPT_SPECIAL")
@XmlRootElement
public class SpecialException extends Exception implements Serializable {

    private static final long serialVersionUID = 1L;

    @Basic(optional = false)
    @Column(name = "EXCEPTIONID", insertable = false, updatable = false)
    private BigDecimal exceptionid;
    [...]
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "specialException")
    private List<SpecialExceptionAttribute> attributes;
    [...]
}

@Entity
@Table(name = "EXCEPT_SPECIAL_ATTR")
@XmlRootElement
public class SpecialExceptionAttribute implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "exception_attr_id_sequence")
    @SequenceGenerator(name = "exception_attr_id_sequence",
            sequenceName = "SEQ_PK_EXCEPT_ATTR", allocationSize = 1)
    private BigInteger id;
    [...]
    @JoinColumn(name = "EXCEPTIONID", referencedColumnName = "EXCEPTIONID")
    @ManyToOne(optional = false)
    private SpecialException specialException;
    [...]
}

0 个答案:

没有答案