From 273394fe4e686d970e53d512a20da62f9f11b013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20G=C3=B3mez?= Date: Thu, 9 Mar 2017 07:06:51 -0600 Subject: [PATCH] Hibernate immutable (#1333) * Add project for hibernate immutable article Add Event entity Add hibernate configuration file Add hibernateutil for configuration Add test to match snippets from article * Create README.md * Update README.md * Migrate hibernate-immutable to spring-hibernate-4 Include integration test Add immutable.cfg.xml Include util for configuration * Remove project for hibernate-immutable --- .../hibernate/immutable/entities/Event.java | 58 +++++++++++++ .../immutable/util/HibernateUtil.java | 29 +++++++ .../src/main/resources/immutable.cfg.xml | 38 +++++++++ .../HibernateImmutableIntegrationTest.java | 84 +++++++++++++++++++ 4 files changed, 209 insertions(+) create mode 100644 spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java create mode 100644 spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java create mode 100644 spring-hibernate4/src/main/resources/immutable.cfg.xml create mode 100644 spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java new file mode 100644 index 0000000000..69cedd39d3 --- /dev/null +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.immutable.entities; + +import org.hibernate.annotations.Cascade; +import org.hibernate.annotations.CascadeType; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Immutable; + +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Set; + +@Entity +@Immutable +@Table(name = "events") +public class Event { + + @Id + @Column(name = "event_id") + @GeneratedValue(generator = "increment") + @GenericGenerator(name = "increment", strategy = "increment") + private Long id; + + @Column(name = "title") + private String title; + + @ElementCollection + @Immutable + private Set guestList; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) + public Set getGuestList() { + return guestList; + } + + public void setGuestList(Set guestList) { + this.guestList = guestList; + } +} diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java new file mode 100644 index 0000000000..0918ff105a --- /dev/null +++ b/spring-hibernate4/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java @@ -0,0 +1,29 @@ +package com.baeldung.hibernate.immutable.util; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static final SessionFactory sessionFactory = buildSessionFactory(); + + private static SessionFactory buildSessionFactory() { + try { + // Create a session factory from immutable.cfg.xml + Configuration configuration = new Configuration(); + configuration.configure("immutable.cfg.xml"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); + return configuration.buildSessionFactory(serviceRegistry); + } catch (Throwable ex) { + System.out.println("Initial SessionFactory creation failed." + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory() { + return sessionFactory; + } +} diff --git a/spring-hibernate4/src/main/resources/immutable.cfg.xml b/spring-hibernate4/src/main/resources/immutable.cfg.xml new file mode 100644 index 0000000000..fe1e3cb723 --- /dev/null +++ b/spring-hibernate4/src/main/resources/immutable.cfg.xml @@ -0,0 +1,38 @@ + + + + + + + + + org.hsqldb.jdbcDriver + jdbc:hsqldb:hsql:mem://localhost/xdb + sa + + + + 1 + + + org.hibernate.dialect.HSQLDialect + + + thread + + + org.hibernate.cache.NoCacheProvider + + + true + + + update + + + + + + \ No newline at end of file diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java new file mode 100644 index 0000000000..83a2fd3cb8 --- /dev/null +++ b/spring-hibernate4/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -0,0 +1,84 @@ +package com.baeldung.hibernate.immutable; + +import com.baeldung.hibernate.immutable.entities.Event; +import com.baeldung.hibernate.immutable.util.HibernateUtil; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class HibernateImmutableIntegrationTest { + private Session session; + @Rule + public final ExpectedException exception = ExpectedException.none(); + + @Before + public void setup() { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.beginTransaction(); + createEvent(); + } + + @After + public void teardown() { + HibernateUtil.getSessionFactory().close(); + } + + @Test + public void addEvent() { + Event event = new Event(); + event.setTitle("Public Event"); + session.save(event); + session.getTransaction().commit(); + } + + @Test + public void updateEvent() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='My Event'").list().get(0); + event.setTitle("Private Event"); + session.saveOrUpdate(event); + session.getTransaction().commit(); + } + + @Test + public void deleteEvent() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='My Event'").list().get(0); + session.delete(event); + session.getTransaction().commit(); + } + + @Test + public void addGuest() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='New Event'").list().get(0); + String newGuest = "Sara"; + event.getGuestList().add(newGuest); + + exception.expect(HibernateException.class); + session.save(event); + session.getTransaction().commit(); + } + + @Test + public void deleteCascade() { + Event event = (Event) session.createQuery( + "FROM Event WHERE title='New Event'").list().get(0); + String guest = event.getGuestList().iterator().next(); + event.getGuestList().remove(guest); + + exception.expect(HibernateException.class); + session.saveOrUpdate(event); + session.getTransaction().commit(); + } + + public void createEvent() { + Event event = new Event(); + event.setTitle("New Event"); + session.save(event); + } +}