为什么JPA在基本用例中忽略了我的@OrderColumn?

时间:2014-05-08 14:54:19

标签: java jpa eclipselink

检验实体:

@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表。

2 个答案:

答案 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?