簡體   English   中英

JPA OneToMany - Collection為null

[英]JPA OneToMany - Collection is null

我正在嘗試使用JPA建立雙向關系。 我理解應用程序的責任是維護關系的雙方。

例如,圖書館有多本圖書。 在圖書館實體我有:

@Entity
public class Library {
  ..
  @OneToMany(mappedBy = "library", cascade = CascadeType.ALL)
  private Collection<Book> books;

  public void addBook(Book b) {
    this.books.add(b);
    if(b.getLibrary() != this)
      b.setLibrary(this);
  }
  ..
}

圖書實體是:

@Entity
public class Book {
  ..
  @ManyToOne
  @JoinColumn(name = "LibraryId")
  private Library library;

  public void setLibrary(Library l) {
    this.library = l;
    if(!this.library.getBooks().contains(this))
      this.library.getBooks().add(this);
  }
  ..
}

不幸的是,OneToMany端的集合為空。 因此,例如,對setLibrary()的調用失敗,因為this.library.getBooks()。contains(this)會導致NullPointerException。

這是正常的行為嗎? 我應該自己實例化這個集合(這看起來有點奇怪),還是有其他解決方案?

實體是Java對象。 Java的基本規則不會因為類上有@Entity注釋而改變。

因此,如果您實例化一個對象並且其構造函數未初始化其中一個字段,則此字段將初始化為null。

是的,您有責任確保構造函數初始化集合,或者所有方法都處理字段的可為空性。

如果從數據庫中獲取此實體的實例(使用em.find(),查詢或通過導航附加實體的關聯),該集合將永遠不會為null,因為JPA將始終初始化集合。

看來,Library類中的Collection類型的書籍類型沒有被啟動。 它是null;

所以當類addBook方法將book對象添加到集合中時。 它會導致NullPointerException。

@OneToMany(mappedBy = "library", cascade = CascadeType.ALL)
 private Collection<Book> books;

 public void addBook(Book b) {
    this.books.add(b);
    if(b.getLibrary() != this)
    b.setLibrary(this);
 }

啟動它並試一試。

更改

private Collection<Book> books;

private Collection<Book> books = new ArrayList<Book>();

嘗試在OneToMany端將fetch類型關聯屬性設置為eager。 實際上,您可以將此部分(this.library.getBooks()。add(this))留在會話中:

Library l = new Library();    
Book b = new Book();
b.setLibrary(l);
l.getBooks().add(b);

暫無
暫無

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

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