如何使用 JPA 和 Hibernate 映射不可变集合
How to map an immutable collection with JPA and Hibernate
我正在使用 JPA 2.1 和 Hibernate 作为 JPA 实现,我想将关系加载为不可变集合。
让我们举一个 Employer
父实体的例子,它有一个 employees
个子集合。
如何指示 JPA 加载不可变的 employees
集合?
您可以使用 @Immutable Hibernate 特定注释:
@OneToMany(mappedBy = "employer")
@Immutable
List<Employee> employees = new ArrayList<>();
另一种选择是在 return 之前克隆集合:
假设你有一个员工列表,你可以这样映射它:
@OneToMany(mappedBy = "employer")
List<Employee> employees = new ArrayList<>();
public List<Employee> getEmployees() {
return org.apache.commons.lang.SerializationUtils.clone(employees);
}
通过省略 setter
并使 getter
return 仅是支持列表的副本,您可以实现不变性。使用深拷贝克隆(例如 org.apache.commons.lang.SerializationUtils
)确保整个实体图被克隆,因此与托管父实体分离。
我正在使用 JPA 2.1 和 Hibernate 作为 JPA 实现,我想将关系加载为不可变集合。
让我们举一个 Employer
父实体的例子,它有一个 employees
个子集合。
如何指示 JPA 加载不可变的 employees
集合?
您可以使用 @Immutable Hibernate 特定注释:
@OneToMany(mappedBy = "employer") @Immutable List<Employee> employees = new ArrayList<>();
另一种选择是在 return 之前克隆集合:
假设你有一个员工列表,你可以这样映射它:
@OneToMany(mappedBy = "employer") List<Employee> employees = new ArrayList<>(); public List<Employee> getEmployees() { return org.apache.commons.lang.SerializationUtils.clone(employees); }
通过省略
setter
并使getter
return 仅是支持列表的副本,您可以实现不变性。使用深拷贝克隆(例如org.apache.commons.lang.SerializationUtils
)确保整个实体图被克隆,因此与托管父实体分离。