java - JPA 实体和关系 OneToMany、ManyToOne、ManyToMany - 良好实践
问题描述
分析一些教程,我发现在实体类中使用 OneToMany、ManyToOne、ManyToMany 注释定义 Java 对象和集合关系时有不同的做法。我对此有两个疑问:
- 我应该使用什么类型的排序规则:Set 还是 List?
例如:
private Set<Employee> employees;
或者
private List<Employee> employees;
- 我应该在实体中创建对象吗?
例如:
private Set<Employee> employees;
或者
private Set<Employee> employees = new HashSet<>();
当我创建一个新对象时,第二种解决方案更好,因为当我使用员工集合时我不会得到 NullPointerException,但是当我从数据库中获取一个对象时,我认为将在创建新对象时创建两个对象实体和第二个当 setEmplyees 被调用时。
在这种情况下,最佳做法是什么?
解决方案
为 1。
我的建议是使用 List 而不是 Set:
private List<Employee> employees;
我的动机:
List 会以我期望的方式运行。如果 List 引用可能包含重复项的数据库条目,则 list 属性将是将它们映射到 java 世界的正确方法。
如果可以安全地假设数据库条目从不包含重复项,则也可以选择 Set。
使用以最佳方式反映数据库状态的集合类型。
对于 2。
我建议始终实例化集合以防止出现 NullPointerException
private Set<Employee> employees = new HashSet<>();
我的动机:
你上面说的是真的。一个 HashSet 实例将在您的实体实例化时创建,另一个实例在setEmployees()
被调用时创建。
然而,在几乎所有情况下,这里的内存和性能损失都可以忽略不计。垃圾收集器会处理这个问题。
空安全论点确实超过了另一个论点,恕我直言。
推荐阅读
- autodesk-forge - 从 SVF 更新到 SVF2 后,法线在自定义着色器中中断
- google-sheets - 如何对 Google 表格中的一组持续时间进行过滤?
- javascript - 迁移机器人框架 3-4:document.getElementsByClassName("wc-header") 不再工作
- javascript - 如果 cookie 被更改,则更新状态 ReactJs/NextJs
- visual-studio-code - 保存格式(更漂亮)不起作用VScode
- json - JSON Schema 的 Swagger UI 更改格式
- c# - 成员类未序列化定义的方式
- sql-server - Azure 数据工厂插入具有父标识的子代
- pine-script - 如何使用 pine-script 中的时间戳函数获取昨天的日期
- python - Windows IIS 服务器在 2 分钟后停止 Django 进程