我们有一个模型,用于存储基本异常(超类)数据与详细异常数据(每种异常类型一个类)分开存储。 每个详细信息异常类都继承自基本异常。
现在,我们要创建一个新的详细异常类(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;
[...]
}