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

要初始化还是不初始化JPA关系映射?

彭梓
2023-03-14
问题内容

在一对多JPA关联中,将空关系初始化为空集合是否被视为最佳实践?例如。

@Entity
public class Order {

   @Id
   private Integer id;

   // should the line items be initialized with an empty array list or not?
   @OneToMany(mappedBy="order")
   List<LineItem> lineItems = new ArrayList<>();

}

在上面的示例中,最好将lineItems默认值定义为空ArrayList吗?优缺点都有什么?


问题答案:

JPA本身并不关心集合是否已初始化。当使用JPA从数据库中检索订单时,JPA将 始终 返回带有非空OrderLine列表的Order。

原因:因为一个订单可以有0行,1行或N行,并且最好用一个空的,一个大小或N个大小的集合进行建模。如果集合为空,则必须在代码中的所有位置进行检查。例如,如果列表为null,则此简单循环将导致NullPointerException:

for (OrderLine line : order.getLines()) {
    ...
}

因此,即使对于新创建的实体实例,也总是要具有非null集合,以使该变量不变。这使得创建新订单的生产代码更安全,更清洁。这也使使用不来自数据库的Order实例的单元测试更安全,更干净。



 类似资料:
  • RT-Thread 的启动流程 宏定义 #define  INIT_BOARD_EXPORT(fn)   INIT_EXPORT(fn, "1")   板级驱动初始化,fn为函数指针   #define  INIT_PREV_EXPORT(fn)   INIT_EXPORT(fn, "2")   纯软件函数自动初始化,fn为函数指针   #define  INIT_DEVICE_EXPORT(fn

  • 之前我们使用大括号声明并初始化了一些Time结构: Time currentTime = { 9, 14, 30.0 }; Time breadTime = { 3, 35, 0.0 }; 现在,通过使用构造函数,我们能用另一种方式来声明和初始化: Time time (seconds); 这两个函数展现了不同的编程风格,以及在C++历史上不同的观点。可能是出于这个原因,C++编译器要求你使用

  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

  • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的

  • new iSlider(DOM, DATA, OPTIONS) Name Type Description DOM dom 容器dom节点 DATA Array 数据列表 OPTIONS Object 配置项 DOM new iSlider(DOM, DATA, OPTIONS); {HTMLElement} 容器dom节点 作为第一个参数并不是必须的,会被OPTIONS.dom覆盖,但是这十分必

  • 确认初始化操作 1)初始化操作用来清空此统计ID的统计数据 2)与启用新的统计ID不同的是,初始化操作使您不需更换网站上的统计代码就可以重新开始统计 注意:初始化操作将清除此统计ID的所有统计数据,此操作不可恢复!!!