当前位置: 首页 > 面试题库 >

JPA OneToMany-集合为空

郭博涉
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 问题 与新HashSet(Collection)等效的Scala)相关,如何将Java集合(例如)转换为Scala集合? 我实际上是在尝试将Java API调用转换为Spring的 (返回a )成Scala不可变。因此,例如: 这似乎有效。欢迎批评! 问题答案: 您的最后一条建议有效,但您也可以避免使用: 请注意,默认情况下,由于提供了此功能。

  • 考虑下面的API方法,它取自Shiro的接口,但也可能存在于其他库中: 是的,即使是现在,仍然有库使用原始类型,可能是为了保持Java 1.5之前的兼容性?! 如果我现在想将此方法与流或选项一起使用,如下所示: 我收到一条关于未经检查的转换和使用原始类型的警告,我更喜欢使用参数化类型。 日食: 类型安全:收集(Collector)方法属于原始类型Stream javac: 注意:GenericsT

  • 问题内容: 我要实现以下功能: 如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String … 编辑: 好吧,我脑子里有个念头,我不知道它是否会起作用 我可以按以下方式实现checkType函数: 是否可以检查T是否为整数?! 提前致谢 问题答案: *由于 类型擦除, *泛型类型参数 在运行时不可恢复(某些特殊情况除外)。这意味着在运行

  • 问题内容: 在Java中为集合的集合设计一个迭代器。迭代器应隐藏嵌套,使您可以迭代属于所有集合的所有元素,就像使用单个集合一样 问题答案: 这是一个可能的实现。请注意,我没有执行remove():

  • JPA实体与具有关系: 和与有多个关系: 在创建新实例并持久化它之后,仍然是。但当我使用空的: DAO由Spring Data JPA实现。 Spring Boot 2.0.4.Release Spring Data JPA 2.0.4.Release Hibernate 5.2.17.Final Hibernate JPA 2.1 1.0.2.Final

  • sdiff key1 key2...keyN 返回所有给定key的差集 sdiffstore dstkey key1...keyN 同sdiff,并同时保存差集到dstkey下