2013-03-21 2 views
5

У меня есть неизменяемый объект, который является частью объекта Hibernate, сохраняемого с использованием сопоставления компонентов. Пример, PinDrop соответствует таблице, которая имеет поле типа неизменного Point:Отображение компонента гибернации неизменяемого объекта

public class PinDrop { 
    private String name; 
    private Point location; 
    // Getters and setters for name and location 
} 

// Immutable Point 
public class Point { 
    private final double x; 
    private final double y; 
    // Getters for x and y, no setters 
} 

В моей PinDrop.hbm.xml:

<property name="name" column="name" type="string"/> 
<component name="location" class="Point> 
    <property name="x" column="location_x" type="double"/> 
    <property name="y" column="location_y" type="double"/> 
</component> 

Это не работает, потому что во время выполнения Hibernate жалуется, что Point не имеют сеттеры для x и y. Есть ли способ использовать неизменяемый объект как компонент постоянного объекта Hibernate?

Последующие действия: Я не использую аннотации, а скорее hbm.xml. Ни mutable, ни immutable являются действительными атрибутами на component и property в hbm.xml.

+0

Вам нужно сделать поля 'final'? –

ответ

5

Вы можете сказать, что спящий режим используется для доступа к полю (атрибут access=field в вашем hbm), поэтому спящий режим не будет жаловаться на отсутствующие аксессоры.

Hibernate использовать отражение, чтобы изменить конечные поля, чтобы он работал.

+3

Я не верил, что это сработает, но это так. По-видимому, конечные поля могут быть изменены с помощью отражения. Интересно, какие последствия это имеет с моделью памяти Java, так как конечные поля гарантируют, что они будут потокобезопасными и правильно видимыми для всех потоков. –

1

Вы пробовали с аннотацией @Immutable?

Отметить сущность или коллекцию как неизменяемую. Нет аннотации означает, что элемент изменен.

Необязательный объект не может быть обновлен приложением. Обновления до неизменяемый объект будет игнорироваться, но исключение не будет выбрано. @Immutable должен использоваться только для корневых объектов.

@Immutable, помещенный в коллекцию, делает коллекцию неизменной, означает, что добавления и удаления в коллекцию и из нее не разрешены. разрешено. В этом случае возникает исключение HibernateException.

Насколько я знаю, для создания таблицы, неизменяемой в * .hbm.xml, атрибут mutable="false" может помочь.

+0

Где я буду хранить это в файле 'hbm.xml'? –

+0

Таблица не является неизменной, а скорее компонентом –

3

Hibernate не очень любит неизменные объекты. Ваши лучшие варианты либо

  • Использование псевдо-неизменны объекты, которые не используют final ключевое слово, но не имеют сеттеры, а затем сказать Hibernate, чтобы установить значения с помощью полей.
  • Имейте спящий режим, чтобы заполнить объект изменчивого объекта-строителя, а затем скопируйте его свойства в надлежащий неизменяемый объект. К сожалению, это означает, что для каждого BO/DTO есть два класса.
+0

Мне нравится этот первый вариант лучше, чем установка окончательных полей через отражение. Установка конечных полей слишком странная, и, как заметил Сью, может испортиться предположения о безопасности потоков, которые не соответствуют действительности. – David

Смежные вопросы