Java Hibernate与超类的一对一关系

Java Hibernate与超类的一对一关系,java,hibernate,jpa,persistence,Java,Hibernate,Jpa,Persistence,我们有一个模型,在该模型中,我们将基本异常(超类)数据与详细异常数据(每个异常类型一个类)分开存储。 每个细节异常类都继承自基本异常 现在我们想要创建一个新的详细异常类(specialException),它与存储属性有一对多的关系 我们创建了如下所述的模型,但hibernate似乎无法将生成的id从超类传播到属性类,从而导致错误: ORA-01400: Einfügen von NULL in ("EXCEPT_SPECIAL_ATTR"."EXCEPTIONID

我们有一个模型,在该模型中,我们将基本异常(超类)数据与详细异常数据(每个异常类型一个类)分开存储。 每个细节异常类都继承自基本异常

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

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

ORA-01400: Einfügen von NULL in ("EXCEPT_SPECIAL_ATTR"."EXCEPTIONID") nicht möglich
当我们尝试插入新异常时,我们希望hibernate自动将SpecialExceptionAttribute.SpecialExceptionId映射到specialException.exceptionid(由exception类中的序列生成器传播)

这可能吗

这是我们的模型:

ExceptionTable <- one to one -> SpecialExceptionTable <- one to many -> SpecialExceptionAttributeTable
ExceptionTable SpecialExceptionTable SpecialExceptionAttribute
代码:

@实体
@继承(策略=InheritanceType.JOINED)
@表(name=“例外情况”)
@XmlRootElement
公共类异常实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
@列(name=“ID”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“异常id\U序列”)
@SequenceGenerator(name=“exception\u id\u sequence”,sequenceName=“SEQ\u EDM\u EXCEPTIONS\u id”,allocationSize=1)
私有双十进制id;
[...]
}
@实体
@PrimaryKeyJoinColumn(name=“exceptionid”)
@表(名称=“特殊情况除外”)
@XmlRootElement
公共类SpecialException扩展异常实现可序列化{
私有静态最终长serialVersionUID=1L;
@基本(可选=假)
@列(name=“EXCEPTIONID”,insertable=false,updateable=false)
私有的BigDecimal例外ID;
[...]
@OneToMany(cascade=CascadeType.ALL,mappedBy=“specialException”)
私有列表属性;
[...]
}
@实体
@表(name=“除特殊属性外”)
@XmlRootElement
公共类SpecialExceptionAttribute实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
@列(name=“ID”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“异常属性id序列”)
@SequenceGenerator(name=“exception\u attr\u id\u sequence”,
sequenceName=“SEQ\u PK\u除属性外”,allocationSize=1)
私有整数id;
[...]
@JoinColumn(name=“EXCEPTIONID”,referencedColumnName=“EXCEPTIONID”)
@多通(可选=假)
私人特殊例外例外;
[...]
}
@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;
    [...]
}