我正在尝试使用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下