From edc6a6e0ecb7a3817b515c3050992b9546b33053 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 9 Jul 2016 07:49:38 +0200 Subject: [PATCH 1/6] Add MMap examples --- .../introduction/AssertJGuavaTest.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index 558ce87d70..ca39a42f48 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -1,6 +1,7 @@ package com.baeldung.assertj.introduction; import com.google.common.base.Optional; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; @@ -13,6 +14,7 @@ import org.assertj.guava.data.MapEntry; import org.junit.Test; import java.io.File; +import java.util.ArrayList; import java.util.HashMap; import static org.assertj.guava.api.Assertions.assertThat; @@ -32,7 +34,7 @@ public class AssertJGuavaTest { @Test public void givenMultimap_whenVerifying_thenCorrect() throws Exception { - final Multimap mmap = Multimaps.newMultimap(new HashMap<>(), Sets::newHashSet); + final Multimap mmap = ArrayListMultimap.create(); mmap.put(1, "one"); mmap.put(1, "1"); @@ -43,6 +45,30 @@ public class AssertJGuavaTest { .contains(entry(1, "1")); } + @Test + public void givenMultimaps_whenVerifyingContent_thenCorrect() throws Exception { + final Multimap mmap1 = ArrayListMultimap.create(); + mmap1.put(1, "one"); + mmap1.put(1, "1"); + mmap1.put(2, "two"); + mmap1.put(2, "2"); + + final Multimap mmap1_clone = Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); + mmap1_clone.put(1, "one"); + mmap1_clone.put(1, "1"); + mmap1_clone.put(2, "two"); + mmap1_clone.put(2, "2"); + + final Multimap mmap2 = Multimaps.newMultimap(new HashMap<>(), Sets::newHashSet); + mmap1.put(1, "one"); + mmap1.put(1, "1"); + + assertThat(mmap1) + .containsAllEntriesOf(mmap2) + .hasSameEntriesAs(mmap1_clone) + .isNotEqualTo(mmap1_clone); + } + @Test public void givenOptional_whenVerifyingContent_thenShouldBeEqual() throws Exception { final Optional something = Optional.of("something"); From cc6b6419a9400ec3b49e34b3d3bd35d43a4a4a74 Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Sat, 9 Jul 2016 10:45:13 +0100 Subject: [PATCH 2/6] Change variable name to be consistence with article text --- .../com/baeldung/assertj/introduction/AssertJCoreTest.java | 4 +--- .../com/baeldung/assertj/introduction/AssertJGuavaTest.java | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJCoreTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJCoreTest.java index 21bc40ae9f..fc134ece00 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJCoreTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJCoreTest.java @@ -14,9 +14,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.entry; -import static org.assertj.core.api.Assertions.withPrecision; +import static org.assertj.core.api.Assertions.*; public class AssertJCoreTest { diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index ca39a42f48..6f369b160e 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -24,10 +24,10 @@ public class AssertJGuavaTest { @Test public void givenTwoEmptyFiles_whenComparingContent_thenEqual() throws Exception { - final File temp = File.createTempFile("bael", "dung"); + final File temp1 = File.createTempFile("bael", "dung1"); final File temp2 = File.createTempFile("bael", "dung2"); - assertThat(Files.asByteSource(temp)) + assertThat(Files.asByteSource(temp1)) .hasSize(0) .hasSameContentAs(Files.asByteSource(temp2)); } From 67eff7ce5730a17b5c592a68868c69970ca9ac18 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 9 Jul 2016 15:08:33 +0200 Subject: [PATCH 3/6] Add MMap examples --- .../assertj/introduction/AssertJGuavaTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index ca39a42f48..6b25bb70dd 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -6,7 +6,6 @@ import com.google.common.collect.HashBasedTable; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Range; -import com.google.common.collect.Sets; import com.google.common.collect.Table; import com.google.common.collect.TreeRangeMap; import com.google.common.io.Files; @@ -14,8 +13,8 @@ import org.assertj.guava.data.MapEntry; import org.junit.Test; import java.io.File; -import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import static org.assertj.guava.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.entry; @@ -53,18 +52,19 @@ public class AssertJGuavaTest { mmap1.put(2, "two"); mmap1.put(2, "2"); - final Multimap mmap1_clone = Multimaps.newListMultimap(new HashMap<>(), ArrayList::new); + final Multimap mmap1_clone = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); mmap1_clone.put(1, "one"); mmap1_clone.put(1, "1"); mmap1_clone.put(2, "two"); mmap1_clone.put(2, "2"); - final Multimap mmap2 = Multimaps.newMultimap(new HashMap<>(), Sets::newHashSet); - mmap1.put(1, "one"); - mmap1.put(1, "1"); + final Multimap mmap2 = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); + mmap2.put(1, "one"); + mmap2.put(1, "1"); assertThat(mmap1) .containsAllEntriesOf(mmap2) + .containsAllEntriesOf(mmap1_clone) .hasSameEntriesAs(mmap1_clone) .isNotEqualTo(mmap1_clone); } From 9cdb683e00c4b8a486094d44521572ce41c39c77 Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Sun, 10 Jul 2016 16:36:05 +0100 Subject: [PATCH 4/6] Update test to match code in the article --- .../baeldung/assertj/introduction/AssertJGuavaTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index 6f369b160e..f6862c1d98 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -60,13 +60,12 @@ public class AssertJGuavaTest { mmap1_clone.put(2, "2"); final Multimap mmap2 = Multimaps.newMultimap(new HashMap<>(), Sets::newHashSet); - mmap1.put(1, "one"); - mmap1.put(1, "1"); + mmap2.put(1, "one"); + mmap2.put(1, "1"); assertThat(mmap1) .containsAllEntriesOf(mmap2) - .hasSameEntriesAs(mmap1_clone) - .isNotEqualTo(mmap1_clone); + .hasSameEntriesAs(mmap1_clone); } @Test From afb2e977fb4e759d21f0fc4b11d3425d5d84beb6 Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Sun, 10 Jul 2016 16:41:03 +0100 Subject: [PATCH 5/6] Update test to match code in the article --- .../com/baeldung/assertj/introduction/AssertJGuavaTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index 93c93d2e52..aee803ada1 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -65,8 +65,7 @@ public class AssertJGuavaTest { assertThat(mmap1) .containsAllEntriesOf(mmap2) .containsAllEntriesOf(mmap1_clone) - .hasSameEntriesAs(mmap1_clone) - .isNotEqualTo(mmap1_clone); + .hasSameEntriesAs(mmap1_clone); } @Test From d0e35e7022d501a14138e6b47556ed816d50daaf Mon Sep 17 00:00:00 2001 From: Sergey Petunin Date: Mon, 11 Jul 2016 01:28:34 +0500 Subject: [PATCH 6/6] Added test examples for the article "Hibernate: save, persist, update, merge, saveOrUpdate" (#487) --- spring-hibernate4/README.md | 1 + spring-hibernate4/pom.xml | 7 + .../baeldung/persistence/model/Person.java | 31 ++ .../persistence/save/SaveMethodsTest.java | 272 ++++++++++++++++++ 4 files changed, 311 insertions(+) create mode 100644 spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java create mode 100644 spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java diff --git a/spring-hibernate4/README.md b/spring-hibernate4/README.md index 4b48fe7064..1f18e1d0e8 100644 --- a/spring-hibernate4/README.md +++ b/spring-hibernate4/README.md @@ -9,6 +9,7 @@ - [Sorting with Hibernate](http://www.baeldung.com/hibernate-sort) - [Auditing with JPA, Hibernate, and Spring Data JPA](http://www.baeldung.com/database-auditing-jpa) - [Stored Procedures with Hibernate](http://www.baeldung.com/stored-procedures-with-hibernate-tutorial) +- [Hibernate: save, persist, update, merge, saveOrUpdate](http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate/) ### Quick Start diff --git a/spring-hibernate4/pom.xml b/spring-hibernate4/pom.xml index 3652674614..4f5cd0c290 100644 --- a/spring-hibernate4/pom.xml +++ b/spring-hibernate4/pom.xml @@ -149,6 +149,13 @@ test + + org.hsqldb + hsqldb + 2.3.4 + test + + diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java b/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java new file mode 100644 index 0000000000..6a95a7acf5 --- /dev/null +++ b/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java @@ -0,0 +1,31 @@ +package com.baeldung.persistence.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Person { + + @Id + @GeneratedValue + private Long id; + + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java new file mode 100644 index 0000000000..aadaefbe44 --- /dev/null +++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsTest.java @@ -0,0 +1,272 @@ +package com.baeldung.persistence.save; + + +import com.baeldung.persistence.model.Person; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.dialect.HSQLDialect; +import org.hibernate.service.ServiceRegistry; +import org.junit.*; + +import static org.junit.Assert.*; + +/** + * Testing specific implementation details for different methods: + * persist, save, merge, update, saveOrUpdate. + */ +public class SaveMethodsTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + Configuration configuration = new Configuration() + .addAnnotatedClass(Person.class) + .setProperty("hibernate.dialect", HSQLDialect.class.getName()) + .setProperty("hibernate.connection.driver_class", org.hsqldb.jdbcDriver.class.getName()) + .setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:test") + .setProperty("hibernate.connection.username", "sa") + .setProperty("hibernate.connection.password", "") + .setProperty("hibernate.hbm2ddl.auto", "update"); + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( + configuration.getProperties()).build(); + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + + @Test + public void whenPersistTransient_thenSavedToDatabaseOnCommit() { + + Person person = new Person(); + person.setName("John"); + session.persist(person); + + session.getTransaction().commit(); + session.close(); + + session = sessionFactory.openSession(); + session.beginTransaction(); + + assertNotNull(session.get(Person.class, person.getId())); + + } + + @Test + public void whenPersistPersistent_thenNothingHappens() { + + Person person = new Person(); + person.setName("John"); + + session.persist(person); + Long id1 = person.getId(); + + session.persist(person); + Long id2 = person.getId(); + + assertEquals(id1, id2); + } + + @Test(expected = HibernateException.class) + public void whenPersistDetached_thenThrowsException() { + + Person person = new Person(); + person.setName("John"); + session.persist(person); + session.evict(person); + + session.persist(person); + + } + + @Test + public void whenSaveTransient_thenIdGeneratedImmediately() { + + Person person = new Person(); + person.setName("John"); + + assertNull(person.getId()); + + Long id = (Long) session.save(person); + + assertNotNull(id); + + session.getTransaction().commit(); + session.close(); + + assertEquals(id, person.getId()); + + session = sessionFactory.openSession(); + session.beginTransaction(); + + assertNotNull(session.get(Person.class, person.getId())); + + } + + @Test + public void whenSavePersistent_thenNothingHappens() { + + Person person = new Person(); + person.setName("John"); + Long id1 = (Long) session.save(person); + Long id2 = (Long) session.save(person); + assertEquals(id1, id2); + + } + + @Test + public void whenSaveDetached_thenNewInstancePersisted() { + + Person person = new Person(); + person.setName("John"); + Long id1 = (Long) session.save(person); + session.evict(person); + + Long id2 = (Long) session.save(person); + assertNotEquals(id1, id2); + + } + + @Test + public void whenMergeDetached_thenEntityUpdatedFromDatabase() { + + Person person = new Person(); + person.setName("John"); + session.save(person); + session.evict(person); + + person.setName("Mary"); + Person mergedPerson = (Person) session.merge(person); + + assertNotSame(person, mergedPerson); + assertEquals("Mary", mergedPerson.getName()); + + } + + @Test + public void whenMergeTransient_thenNewEntitySavedToDatabase() { + + Person person = new Person(); + person.setName("John"); + Person mergedPerson = (Person) session.merge(person); + + session.getTransaction().commit(); + session.beginTransaction(); + + assertNull(person.getId()); + assertNotNull(mergedPerson.getId()); + + } + + @Test + public void whenMergePersistent_thenReturnsSameObject() { + + Person person = new Person(); + person.setName("John"); + session.save(person); + + Person mergedPerson = (Person) session.merge(person); + + assertSame(person, mergedPerson); + + } + + @Test + public void whenUpdateDetached_thenEntityUpdatedFromDatabase() { + + Person person = new Person(); + person.setName("John"); + session.save(person); + session.evict(person); + + person.setName("Mary"); + session.update(person); + assertEquals("Mary", person.getName()); + + } + + @Test(expected = HibernateException.class) + public void whenUpdateTransient_thenThrowsException() { + + Person person = new Person(); + person.setName("John"); + session.update(person); + + } + + @Test + public void whenUpdatePersistent_thenNothingHappens() { + + Person person = new Person(); + person.setName("John"); + session.save(person); + + session.update(person); + + } + + @Test + public void whenSaveOrUpdateDetached_thenEntityUpdatedFromDatabase() { + + Person person = new Person(); + person.setName("John"); + session.save(person); + session.evict(person); + + person.setName("Mary"); + session.saveOrUpdate(person); + assertEquals("Mary", person.getName()); + + } + + @Test + public void whenSaveOrUpdateTransient_thenSavedToDatabaseOnCommit() { + + Person person = new Person(); + person.setName("John"); + session.saveOrUpdate(person); + + session.getTransaction().commit(); + session.close(); + + session = sessionFactory.openSession(); + session.beginTransaction(); + + assertNotNull(session.get(Person.class, person.getId())); + + + } + + @Test + public void whenSaveOrUpdatePersistent_thenNothingHappens() { + + Person person = new Person(); + person.setName("John"); + session.save(person); + + session.saveOrUpdate(person); + + } + + @After + public void tearDown() { + session.getTransaction().commit(); + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } + +}