检验实体:
@Entity
@Table(name="INSPECTION")
public class Inspection implements Serializable
{
...
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, orphanRemoval=true)
@OrderColumn(name="LIST_INDEX", nullable=false)
@JoinColumn(name="INSPECTION_ID")
private List<RecommendationInstance> recommendations;
...
}
RecommendationInstance实体
@Entity
@Table(name = "RECOMMENDATION_INSTANCE")
public class RecommendationInstance implements Serializable
{
@SequenceGenerator(name="RECOMMENDATION_INST_SEQ_GEN", sequenceName="RECOMMENDATION_INST_SEQ", allocationSize=1, initialValue=100)
@Id @GeneratedValue(generator="RECOMMENDATION_INST_SEQ_GEN", strategy=GenerationType.SEQUENCE)
private Long id;
@Column(name="INSPECTION_ID")
private Long inspectionId;
@ManyToOne
@JoinColumn(name="RECOMMENDATION_ID")
private Recommendation recommendation;
@Column(name="DESCRIPTION")
private String description;
...
}
表格创建如下:
CREATE TABLE "RECOMMENDATION_INSTANCE"
( "ID" NUMBER(19,0) NOT NULL,
"INSPECTION_ID" NUMBER(19,0) NOT NULL,
"RECOMMENDATION_ID" NUMBER(19,0) NOT NULL,
"DESCRIPTION" VARCHAR2(4000 BYTE) NOT NULL,
"LIST_INDEX" NUMBER(4,0) NOT NULL
) ;
当创建新的RecommendationInstance并且我尝试保存InspectionEntity时,我收到以下错误:
Caused by: org.eclipse.persistence.exceptions.DatabaseException:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: NOT NULL check constraint; SYS_CT_10161 table: "RECOMMENDATION_INSTANCE" column: "LIST_INDEX"
Error Code: -10
Call: INSERT INTO RECOMMENDATION_INSTANCE (ID, DESCRIPTION, INSPECTION_ID, RECOMMENDATION_ID) VALUES (?, ?, ?, ?)
bind => [102, Sprinkler System DESCRIPTION, 110, 40]
我在这里错过了一些关系吗?看起来似乎完全忽略了list_index。
为了提供更多信息,如果需要,我确实使用了连接表。但是我正在做一个重构,因为不需要连接表。这将LIST_INDEX列从连接表移动到RecommendationInstance表。
答案 0 :(得分:0)
之前我已经这样做了,但是使用@OrderBy
注释,例如,我最近写的一段代码:
@OneToMany(mappedBy = "product")
@OrderBy("createdDateTime ASC")
private Collection<SkuUpc> skuUpcs;
SkuUpc
有哪个
@Column(name = "created_dt")
private Date createdDateTime = new Timestamp(new Date().getTime());
答案 1 :(得分:0)
我发现当我删除NOT NULL约束时,一切正常(duh),但我决定现在可以解决这个问题。查看日志,JPA首先在没有list_index(因此违反约束)的情况下插入行,然后在运行更新后立即设置list_index。
这个答案确实创建了一个更具体的问题,即为什么它在插入行时不设置list_index,即使我指定nullable=false
我在这里问了更具体的问题:Why does JPA update the OrderColumn instead of setting it on creation?