具有未知PK / FK属性的级联持久性JPA实体违反NotNullConstraint

时间:2015-09-17 09:37:27

标签: java jpa eclipselink

我希望通过只有一次persist调用来保持JPA实体与1:1或1:多关系。

问题:实体的主键是自动生成的,并用作子实体中的外键。提交事务时,有一个异常指出子实体的外键列上违反了NotNullConstraint。

  

内部异常:java.sql.SQLException:ORA-01400:插入   (" SCHEMA"。" PROTOCOL_FILE"。" PROTOCOL_ID")中的NULL不可能

父实体:

@Entity
@Table(name = "...")
public class Protocol {

    @Id
    @GeneratedValue(generator="SQ_PROTOCOL", strategy=GenerationType.SEQUENCE)
    @SequenceGenerator(name="SQ_PROTOCOL", sequenceName="SQ_PROTOCOL", allocationSize=50)
    @Column(name = "PROTOCOL_ID")
    private Long protocolId;

    @OneToOne(mappedBy="protocol", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private ProtocolFile file;

    //Other attributes and getter/setter omitted
}

子实体:

@Entity
@Table(name = "PROTOCOL_FILE")
public class ProtocolFile {

    @Id
    @Column(name = "PROTOCOL_ID")
    private Long protocolId;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumns(@JoinColumn(name="PROTOCOL_ID", referencedColumnName="PROTOCOL_ID", updatable=false, insertable=false))
    private Protocol protocol;

    //Other attributes and getter/setter omitted
}

您是否知道一个方便的解决方案,因此我可以在一次通话中保留属于Protocol的所有实体?

1 个答案:

答案 0 :(得分:1)

你在这里的情况是一个"派生的身份" ProtocolFile的{​​{1}}的ID是ProtocolFile的ID,并且它们之间存在一对一的关系。

我发现您使用的是Protocol,但最好遵循建议使用updatable=false, insertable=false注释的规范:

@MapsId

或者您可能希望完全跳过@Entity @Table(name = "PROTOCOL_FILE") public class ProtocolFile { @Id // No @Column here private Long protocolId; @MapsId // --- HERE @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name="PROTOCOL_ID") // Just that private Protocol protocol; } 字段并在关系上添加protocolId注释。

@Id

当然,您需要在创建期间将@Entity @Table(name = "PROTOCOL_FILE") public class ProtocolFile { @Id // --- HERE @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name="PROTOCOL_ID") // Just that private Protocol protocol; } 实例设置为protocol,而不再在以后更改它(例如,仅允许使用file构造函数进行设置)

参见" 2.4.1与派生身份相对应的主要密钥" JPA 2.0 spec的详细信息和示例(示例4 似乎是您的情况)。