簡體   English   中英

使用CascadeType.ALL的JPA外鍵約束

[英]JPA foreign key constraint with CascadeType.ALL

我有2個實體

那是第一個實體

public class Manager {

    // ...

    @OneToMany(mappedBy = "manager", cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ExpertAndRequest> requests;

    // ...

}

第二實體。 這是兩個實體的綁定表。

@Entity
@Data
@Table(name = "SOME_TABLE_NAME")
@IdClass(ExpertAndRequestId.class)
public class ExpertAndRequest implements Serializable {

    @Id
    private Long managerId;

    @Id
    private Long requestId;


    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "managerId", updatable = false, insertable = false, referencedColumnName = "id")
    private Manager manager;


    @ManyToOne
    @JoinColumn(name = "requestId", updatable = false, insertable = false, referencedColumnName = "id")
    private ParticipantRequest request;



}

所以我從表中刪除數據

this.managerRepository.delete(manager);        

我得到異常:

org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation

我究竟做錯了什么?


編輯

我更新了上面的課程。

這是IdClass

@Data
public class ExpertAndRequestId implements Serializable {

    private long managerId;
    private long requestId;


    public int hashCode() {
        return (int)(managerId + requestId);
    }

    public String toString() {

        return String.format("ExpertAndRequestId [expert = \"%s\", request=\"%s\"]", this.managerId, this.requestId);

    }

    public boolean equals(Object object) {
        if (object instanceof ExpertAndRequestId) {
            ExpertAndRequestId otherId = (ExpertAndRequestId) object;
            return (otherId.requestId == this.requestId) && (otherId.managerId == this.managerId);
        }
        return false;
    }

}

第三實體

public class ParticipantRequest {

    // ...

    @OneToMany(mappedBy = "request", cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ExpertAndRequest> experts;

    // ...

}

我從https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany獲得的示例

當您在父實體ManagerExpertAndRequest之間建立雙向關系時,您需要的是CascadeType.REMOVE (或CascadeType.ALL,其中包括REMOVE):您對Hibernate說:“如果父實體被刪除,請刪除子實體”。 在這里進行llo了解如何同時使用CascadeType.REMOVEorphanRemoval

嘗試使用cascade = {CascadeType.PERSIST, CascadeType.MERGE}而不是cascade = CascadeType.ALL並以該站點為參考。

暫無
暫無

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

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