[英]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.accident
和Accident.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
設置為適當的值。 上面的實現中仍然有很多問題,我將留給您(例如,當您以前accidents
過accidents
,現在又被另一個列表取代了)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.