diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 85ef01e704..bab544e203 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -97,6 +97,11 @@
+
+ com.h2database
+ h2
+ 1.3.170
+
com.fasterxml.jackson.core
jackson-databind
@@ -150,6 +155,16 @@
xstream
1.4.16
+
+ org.springframework.data
+ spring-data-jpa
+ 2.1.5.RELEASE
+
+
+ javax.persistence
+ javax.persistence-api
+ 2.2
+
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/User.java b/libraries-data/src/main/java/com/baeldung/objecthydration/User.java
new file mode 100644
index 0000000000..9d879d62c4
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/User.java
@@ -0,0 +1,75 @@
+package com.baeldung.objecthydration;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class User implements Serializable {
+ private String uId;
+ private String firstName;
+ private String lastName;
+ private String alias;
+
+ public User() {
+ }
+
+ public User(String firstName, String uId, String lastName, String alias) {
+ this.firstName = firstName;
+ this.uId = uId;
+ this.lastName = lastName;
+ this.alias = alias;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ User user = (User) o;
+ return Objects.equals(firstName, user.firstName) && Objects.equals(uId, user.uId) && Objects.equals(lastName, user.lastName) && Objects.equals(alias, user.alias);
+ }
+
+ public String getuId() {
+ return uId;
+ }
+
+ public void setuId(String uId) {
+ this.uId = uId;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getAlias() {
+ return alias;
+ }
+
+ public void setAlias(String alias) {
+ this.alias = alias;
+ }
+
+ public void generateMyUser() {
+ this.setAlias("007");
+ this.setFirstName("James");
+ this.setLastName("Bond");
+ this.setuId("JB");
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, uId, lastName, alias);
+ }
+}
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java b/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java
new file mode 100644
index 0000000000..c9d8c5773f
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/UserSerialisationDeserialisation.java
@@ -0,0 +1,34 @@
+package com.baeldung.objecthydration;
+
+import java.io.*;
+
+public class UserSerialisationDeserialisation {
+ public void serialisedUser(User user, String outputName) {
+ try {
+ FileOutputStream fileOut = new FileOutputStream(outputName);
+ ObjectOutputStream out = new ObjectOutputStream(fileOut);
+ out.writeObject(user);
+ out.close();
+ fileOut.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public User deserialiseUser(String serialisedFile) {
+ User deserializedUser = null;
+ try {
+ FileInputStream fileIn = new FileInputStream(serialisedFile);
+ ObjectInputStream in = new ObjectInputStream(fileIn);
+ deserializedUser = (User) in.readObject();
+ in.close();
+ fileIn.close();
+ } catch (IOException | ClassNotFoundException e) {
+ e.printStackTrace();
+ } finally {
+ File f = new File(serialisedFile);
+ f.delete();
+ }
+ return deserializedUser;
+ }
+}
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java b/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java
new file mode 100644
index 0000000000..3ae22cee88
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/entity/Book.java
@@ -0,0 +1,71 @@
+package com.baeldung.objecthydration.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "books")
+public class Book {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "author")
+ private String author;
+
+ @Column(name = "isbn")
+ private String isbn;
+
+ // Constructors, getters, and setters
+
+ public Book() {
+ // Default constructor required by Hibernate
+ }
+
+ public Book(String name, String author, String isbn) {
+ this.name = name;
+ this.author = author;
+ this.isbn = isbn;
+ }
+
+ // Getters and setters for all attributes
+
+ 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;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getIsbn() {
+ return isbn;
+ }
+
+ public void setIsbn(String isbn) {
+ this.isbn = isbn;
+ }
+}
\ No newline at end of file
diff --git a/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java b/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java
new file mode 100644
index 0000000000..a8e92eab8e
--- /dev/null
+++ b/libraries-data/src/main/java/com/baeldung/objecthydration/repository/BookRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.objecthydration.repository;
+
+import com.baeldung.objecthydration.entity.Book;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface BookRepository extends JpaRepository {
+}
diff --git a/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java b/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java
new file mode 100644
index 0000000000..317827346f
--- /dev/null
+++ b/libraries-data/src/test/java/com/baeldung/objecthydration/HydrationUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.objecthydration;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HydrationUnitTest {
+
+ @Test
+ public void givenEmptyClass_whenLazilyinitialised_thenGiveNullOnGet() {
+ User iamUser = new User();
+ Assert.assertNull(iamUser.getuId());
+ }
+
+ @Test
+ public void givenInitialisedClass_withLazilyInitialised_thenDoesNotGiveNullOnGet() {
+ User iamUser = new User();
+ iamUser.setAlias("007");
+ Assert.assertNotNull(iamUser.getAlias());
+ }
+
+ @Test
+ public void givenEmptyClass_withHydration_thenShouldHaveAllAttributesSet() {
+ User jamesBond = new User();
+ Assert.assertNull(jamesBond.getAlias());
+
+ jamesBond.generateMyUser();
+ Assert.assertEquals("007", jamesBond.getAlias());
+ }
+
+ @Test
+ public void givenUser_thenShouldPerformUserSerialisationDeserialisation() {
+ User iamUser = new User();
+ iamUser.setAlias("007");
+ UserSerialisationDeserialisation usd = new UserSerialisationDeserialisation();
+ usd.serialisedUser(iamUser, "bond.ser");
+ User deserialisedUser = usd.deserialiseUser("bond.ser");
+ Assert.assertEquals(iamUser.getAlias(), deserialisedUser.getAlias());
+
+ }
+}