【问题标题】:JPA Entity and relations OneToMany, ManyToOne, ManyToMany - good practice [closed]JPA 实体和关系 OneToMany、ManyToOne、ManyToMany - 良好实践 [关闭]
【发布时间】:2020-05-23 10:52:56
【问题描述】:

分析一些教程,我发现在实体类中使用 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 时创建新实体和第二个。

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

【问题讨论】:

    标签: java jpa entity


    【解决方案1】:

    1.

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

    private List<Employee> employees;
    

    我的动机:

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

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

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

    2.

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

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

    我的动机:

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

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

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

    【讨论】:

      【解决方案2】:

      列表与集合

      您根据需要的行为进行选择:

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

      初始化集合

      IMO 两种情况都很好。

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

      【讨论】:

      • 例如尊重从 DB 加载的记录的顺序 当指定 @OrderBy 时,您的 JPA 提供程序应该使用 LinkedHashSetimplementation 对集合执行相同操作协会。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多