分析一些教程,我发现在实体类中使用OneToMany,ManyToOne,ManyToMany批注定义Java对象和集合关系的实践有所不同。我对此有两个疑问:
例如:
private Set<Employee> employees;
或
private List<Employee> employees;
例如:
private Set<Employee> employees;
或
private Set<Employee> employees = new HashSet<>();
当我创建一个新对象时,第二种解决方案更好,因为使用雇员集合时不会出现NullPointerException,但是从数据库中获取一个对象时,我会创建两个对象创建新实体,第二个是在调用setEmplyees时。
在这种情况下的最佳做法是什么?
答案 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)
列表与设置
您可以根据自己的行为进行选择:
初始化集合
两种情况都很好。
如果未定义(空),则当您自己创建容器对象的实例时,需要注意可能的NPE。
将该对象加载为JPA时,最终将包含一个非null值。