如何使用 JPA 和 Hibernate 映射不可变集合

sha*_*dra 6 java orm hibernate jpa hibernate-mapping

我使用 JPA 2.1 和 Hibernate 作为 JPA 实现,并且我想将关系加载为不可变集合。

让我们以具有子集合的Employer父实体为例employees

如何指示 JPA 加载不可变employees集合?

Vla*_*cea 5

  1. 您可以使用@Immutable Hibernate 特定注释:

    @OneToMany(mappedBy = "employer")
    @Immutable
    List<Employee> employees = new ArrayList<>();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 另一种选择是在返回集合之前克隆它:

    假设你有一个员工列表,你可以像这样映射它:

    @OneToMany(mappedBy = "employer")
    List<Employee> employees = new ArrayList<>();
    
    public List<Employee> getEmployees() {
        return org.apache.commons.lang.SerializationUtils.clone(employees);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    通过省略setter并且getter只返回支持列表的副本,您可以实现不变性。使用深拷贝克隆(例如 org.apache.commons.lang.SerializationUtils)确保整个实体图被克隆并因此与托管父实体分离。