JPA OneToMany-集合为空

我正在尝试使用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始终会初始化该集合。

以上是 JPA OneToMany-集合为空 的全部内容, 来源链接: utcz.com/qa/408499.html

回到顶部