JPA实体和关系OneToMany,ManyToOne,ManyToMany-良好实践

时间:2020-02-07 10:01:37

标签: java jpa entity

分析一些教程,我发现在实体类中使用OneToMany,ManyToOne,ManyToMany批注定义Java对象和集合关系的实践有所不同。我对此有两个疑问:

  1. 我应该使用哪种排序规则:Set或List?

例如:

private Set<Employee> employees;

private List<Employee> employees;
  1. 我应该在实体中创建对象吗?

例如:

private Set<Employee> employees;

private Set<Employee> employees = new HashSet<>();

当我创建一个新对象时,第二种解决方案更好,因为使用雇员集合时不会出现NullPointerException,但是从数据库中获取一个对象时,我会创建两个对象创建新实体,第二个是在调用setEmplyees时。

在这种情况下的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

对于1。

我的建议是使用列表而不是Set:

private List<Employee> employees;

我的动力:

列表将以我期望的方式运行。如果List引用的数据库条目可能包含重复项,则list属性将是将它们映射到Java世界的正确方法。

如果可以安全地假设数据库条目从不包含重复项,则还可以选择一个Set。

使用以最佳方式镜像数据库状态的收集类型。

对于2。

我建议始终实例化集合以防止NullPointerException

private Set<Employee> employees = new HashSet<>();

我的动力:

你上面说的是真的。 HashSet的一个实例将在您的实体实例化时创建,另一个实例将在调用setEmployees()时创建。

但是,在几乎所有情况下,此处的内存和性能损失都可以忽略不计。垃圾收集器将处理此问题。

null安全性参数确实胜过另一个参数imho。

答案 1 :(得分:0)

列表与设置

您可以根据自己的行为进行选择:

  • list:通常保证顺序(取决于底层实现,即ArrayList),例如,尊重从DB加载的记录的顺序
  • 设置:不能保证顺序,但不允许重复

初始化集合

两种情况都很好。

如果未定义(空),则当您自己创建容器对象的实例时,需要注意可能的NPE。
将该对象加载为JPA时,最终将包含一个非null值。