1. Обзор
В этой статье мы поговорим о том, как мы можем сделать объект, сбор или атрибут Неизменяемые в Спячке.
По умолчанию поля являются мутируемыми, что означает, что мы можем выполнять операции на них, которые меняют их состояние.
2. Мавен
Чтобы получить наш проект и работает, мы сначала должны добавить необходимые зависимости в нашу пом.xml . И по мере того, как мы работаем с Hibernate, мы добавим соответствующий зависимость :
org.hibernate hibernate-core 5.2.8.Final
И потому, что мы работаем с ХСЛДБ , нам также нужно:
org.hsqldb hsqldb 2.3.4
3. Аннотация о сущностях
Во-первых, давайте определим простой класс сущности:
@Entity @Immutable @Table(name = "events_generated") public class EventGeneratedId { @Id @Column(name = "event_generated_id") @GeneratedValue(generator = "increment") @GenericGenerator(name = "increment", strategy = "increment") private Long id; @Column(name = "name") private String name; @Column(name = "description") private String description; // standard setters and getters }
Как вы заметили, мы добавили уже @Immutable аннотация к нашей сущности, так что если мы попытаемся сохранить Событие :
@Test public void addEvent() { Event event = new Event(); event.setId(2L); event.setTitle("Public Event"); session.save(event); session.getTransaction().commit(); session.close(); }
Тогда мы должны получить выход:
Hibernate: insert into events (title, event_id) values (?, ?)
Выход должен быть таким же, даже если мы удалим аннотацию, то есть нет никакого эффекта, когда мы пытаемся добавить сущность, независимо от аннотации.
Важно также отметить, что в нашей EventGeneratedId лица, мы добавили Сгенерированная аннотация, но это будет иметь значение только тогда, когда мы создаем сущность. Это потому, что он определяет стратегию генерации для идентификатора – любые другие операции не повлияют на Id поле из-за Неизменяемые аннотация.
3.1. Обновление сущности
Теперь у нас не было проблем с сохранением сущности, давайте попробуем обновить ее:
@Test public void updateEvent() { Event event = (Event) session.createQuery( "FROM Event WHERE title='My Event'").list().get(0); event.setTitle("Public Event"); session.saveOrUpdate(event); session.getTransaction().commit(); }
Hibernate будет просто игнорировать обновление операции без каких-либо исключений. Однако, если мы удалим @Immutable аннотация мы получаем другой результат:
Hibernate: select ... from events where title='My Event' Hibernate: update events set title=? where event_id=?
Это говорит нам о том, что наш объект теперь является является значением по умолчанию, если мы не включим аннотацию) и позволит обновлению делать свою работу.
3.2. Удаление сущности
Когда дело доходит до удаления сущности:
@Test public void deleteEvent() { Event event = (Event) session.createQuery( "FROM Event WHERE title='My Event'").list().get(0); session.delete(event); session.getTransaction().commit(); }
Мы сможем выполнить удаление независимо от того, является ли оно мутируемым или нет:
Hibernate: select ... from events where title='My Event' Hibernate: delete from events where event_id=?
4. Аннотация о коллекциях
До сих пор мы видели, что аннотация делает для сущностей, но, как мы уже упоминали в начале, она также может быть применена к коллекциям.
Во-первых, давайте добавим коллекцию к нашему Событие класс:
@Immutable public SetgetGuestList() { return guestList; }
Так же, как и раньше, мы добавили аннотацию заранее, так что если мы идем вперед и попытаться добавить элемент в нашу коллекцию:
org.hibernate.HibernateException: changed an immutable collection instance: [com.baeldung.entities.Event.guestList#1]
На этот раз мы получаем исключение, потому что с коллекциями мы не можем добавить или удалить их.
4.1. Удаление коллекций
Другой сценарий, где Коллекционая будучи неизменным будет бросать исключение это всякий раз, когда мы пытаемся удалить, и мы установили @Cascade аннотация.
Таким образом, всякий раз, когда @Immutable присутствует, и мы пытаемся удалить:
@Test public void deleteCascade() { Event event = (Event) session.createQuery( "FROM Event WHERE title='Public Event'").list().get(0); String guest = event.getGuestList().iterator().next(); event.getGuestList().remove(guest); session.saveOrUpdate(event); session.getTransaction().commit(); }
выпуск:
org.hibernate.HibernateException: changed an immutable collection instance: [com.baeldung.entities.Event.guestList#1]
5.XML Заметки
Наконец, конфигурация также может быть выполнена с помощью XML через мутируемые и ложные атрибут:
Однако, поскольку мы в основном реализовали примеры с использованием метода аннотации, мы не будем в подробности с помощью XML.
6. Заключение
В этой быстрой статье мы исследуем полезные @Immutable аннотация из Hibernate, и как это может помочь нам определить лучшую семантику и ограничения на наши данные.
Как всегда, реализация всех этих примеров и фрагментов можно найти в проект GitHub . Это Maven основе проекта, поэтому она должна быть легко импортировать и запускать.