簡體   English   中英

具有未知PK / FK屬性的級聯持久JPA實體違反NotNullConstraint

[英]Cascade persist JPA entities with unknown PK/FK attributes violates NotNullConstraint

我想通過一個persist調用來persist具有許多1:1或1:許多關系的JPA實體。

問題:實體的主鍵是自動生成的,並用作子實體中的外鍵。 提交事務后,會出現一個異常,指出子實體的外鍵列上的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所有實體?

你這里的情況是一種“派生身份” ProtocolFile -中的ID ProtocolFile是的ID Protocol ,並在它們之間存在一個一對一的關系。

我看到您使用的是@MapsId 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 ,並且以后不再更改(例如,僅允許使用ProtocolFile構造函數進行設置)。

有關更多詳細信息和示例,請參見JPA 2.0規范的 “ 2.4.1與派生身份相對應的主鍵”部分( 示例4似乎是您的情況)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM