休眠与超类的一对多关系

问题描述

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

现在,我们要创建一个新的详细异常类(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;
    [...]
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)