2015-07-20 2 views
4

Я использую JPA 2.1 и hibernate как JPA реализация. Я хочу загрузить отношения как непреложную коллекцию.Загрузка коллекций JPA как неизменяемых

Давайте рассмотрим пример employer и employee объектов с fetchtype, установленных как eagar, на поле employees. Что можно сделать, чтобы дать команду JPA загрузить коллекцию сотрудников как неизменяемую?

+0

В чем проблема с возвратом 'Collections.unmodifiableSet (employees)' из получателя вашей ассоциации? –

+0

@JBNizet Я использую lombok для генерации метода getter и не хочу вручную создавать метод getter. – shailendra

ответ

2
  1. Вы можете использовать @Immutable Hibernate конкретные аннотации:

    @OneToMany(mappedBy = "employer") 
    @Immutable 
    List<Employee> employees = new ArrayList<>(); 
    
  2. Другой вариант заключается в клонировать коллекции до возвращения его:

    Предполагая, что у вас есть список сотрудников, вы можете Назовите его следующим образом:

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

    Опустить e и имея getter, верните только копию списка подписок, вы можете достичь неизменности. Использование клонирования с глубоким копированием (например, org.apache.commons.lang.SerializationUtils) гарантирует, что весь граф объекта будет клонирован и, следовательно, отделен от управляемого родительского объекта.

+0

Я пока буду с @Immutable, но я искал решение для JPA для решения этой проблемы. – shailendra

+0

Второе решение IMO не является оптимальным решением для глобальных данных, к которому часто обращаются, поскольку клонирование будет влиять на производительность, а также потреблять больше памяти. – shailendra