Java 为什么JPA更新OrderColumn而不是在创建时设置它?

Java 为什么JPA更新OrderColumn而不是在创建时设置它?,java,jpa,eclipselink,Java,Jpa,Eclipselink,我想在OrderColumn上的表中添加一个NOTNULL约束。使用约束运行代码时,会出现约束冲突错误。在没有约束的情况下运行时,我看到行首先插入时没有OrderColumn,然后立即使用正确的OrderColumn进行更新。这种行为有什么原因吗 管理OrderColumn的我的实体: @Entity @Table(name="INSPECTION") public class Inspection implements Serializable { ... @OneToMany

我想在OrderColumn上的表中添加一个NOTNULL约束。使用约束运行代码时,会出现约束冲突错误。在没有约束的情况下运行时,我看到行首先插入时没有OrderColumn,然后立即使用正确的OrderColumn进行更新。这种行为有什么原因吗

管理OrderColumn的我的实体:

@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;
    ...
}
@实体
@表(name=“检验”)
公共类检查实现了可序列化
{
...
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE},orphanRemoving=true)
@OrderColumn(name=“LIST\u INDEX”,null=false)
@JoinColumn(name=“检验ID”)
私人名单建议;
...
}

这个问题源于我对为什么我的OrderColumn没有被插入感到困惑。这里可以看到其他代码示例。

这里的问题是RecommendationInstance实体是一个独立的实体,没有order列的映射。Eclipselink旨在仅从实体本身创建插入。有一个特性要求有eclipselink存储语句,并在处理其他映射时添加到这些语句中,但我仍然没有它

为了避免此类错误,请尝试向数据库表中的字段添加默认值,例如,对于mysql:

alter table YourTable modify column index_column int(5) not null default 0;
这样,如果您的JPA提供者(例如eclipselink)首先进行插入,而没有给index_列一个值,那么它将给出默认值0,从而避免此错误。如果JPA提供者随后用正确的值刷新此值,则应该没有问题