簡體   English   中英

休眠@OneToMany嘗試插入null

[英]Hibernate @OneToMany tries to insert null

我有以下簡單的例子。 當它運行時,我看到使用自動生成的ID生成的QuoteRequest對象。 接下來,我看到正在生成Accidents對象,但是插入的quote_request_id為null,因此出現錯誤:

列“ quote_request_id”不能為空

@Entity
@Table(name = "Quotes")
public class QuoteRequest
{
    public QuoteRequest(){}

    @Id
    @Column(name = "quote_request_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long QuoteRequestId;


    @OneToMany(mappedBy = "quoteRequest", cascade = CascadeType.ALL)
    @OrderColumn(name = "accidents_id")
    private Accidents[] accidents;

    // Getters and setters
}

@Entity
@Table(name = "Accidents")
public class Accidents
{
    public Accidents()
    {
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "accidents_id")
    private long AccidentId;


    @Column(name = "amount", nullable = false)
    private Float amount;

    @ManyToOne(optional = false, cascade = CascadeType.ALL)
    @JoinColumn(name = "quote_request_id", nullable = false)
    private QuoteRequest quoteRequest;

    // Getters and setters
}

為什么不將新生成的ID插入事故列?

首先,將@OneToMany從使用數組更改為使用List

@OneToMany(mappedBy = "quoteRequest", cascade = CascadeType.ALL)
@OrderColumn(name = "accidents_id")
private List<Accidents> accidents = new ArrayList()<>;

確保設置關聯的兩面:

QuoteRequest quoteRequest = ...
Accidents accidents = ...

quoteRequest.getAccidents().add(accident);
accident.setQuoteRequest(quoteRequest);

在創建事故時,我沒有設置quoteRequest屬性。 我應該做些什么嗎? 我需要建立雙向關系嗎?

這就是原因。

首先,“我需要建立雙向關系嗎?”。 好吧,你是唯一可以說出來的人。 但是,您已經具有雙向關系。 通過設置的方式, Accident一方擁有該關系。 這意味着,對於DB Column Accident.quote_req_id依賴於字段Accident.quoteRequest 由於尚未填充該字段,因此Hibernate假定該字段為null。 因此,它正在插入null。 所有預期的行為。

簡而言之,您應確保QuoteRequest.accidentAccident.quoteRequest是一致的,例如:

class QuoteRequest {
    private List<Accident> accidents = new ArrayList<>();  // I prefer List or Set

    public void setAccidents(List<Accident> accidents) {
        this.accidents.clear();
        if (accidents != null) {
            // intentionally keeping another list, to be defensive and not
            // affected by subsequent change in the caller's list
            this.accidents = this.accidents.addAll(accidents);
            for (Accident accident:accidents) {
                accident.setQuoteRequest(this);
            }
        }
    }
}

class Accident {
    private QuoteRequest quoteRequest;
    public setQuoteRequest(QuoteRequest quoteRequest) {
        // there will be something more...
        this.quoteRequest = quoteRequest;
    }
}

這只是關於其外觀的非常基本的示例。 簡而言之,您需要將Accident.quoteRequest設置為適當的值。 上面的實現中仍然有很多問題,我將留給您(例如,當您以前accidentsaccidents ,現在又被另一個列表取代了)

暫無
暫無

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

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