首页 > 解决方案 > JPA 实体和关系 OneToMany、ManyToOne、ManyToMany - 良好实践

问题描述

分析一些教程,我发现在实体类中使用 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 被调用时。

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

标签: javajpaentity

解决方案


为 1。

我的建议是使用 List 而不是 Set:

private List<Employee> employees;

我的动机:

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

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

使用以最佳方式反映数据库状态的集合类型。

对于 2。

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

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

我的动机:

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

然而,在几乎所有情况下,这里的内存和性能损失都可以忽略不计。垃圾收集器会处理这个问题。

空安全论点确实超过了另一个论点,恕我直言。


推荐阅读