{"id":1800,"date":"2012-09-19T11:32:00","date_gmt":"2012-09-19T11:32:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/spring-persistence-layer-writing-entities-and-configuring-hibernate.html"},"modified":"2012-10-22T06:49:14","modified_gmt":"2012-10-22T06:49:14","slug":"spring-persistence-layer-writing","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html","title":{"rendered":"Spring &#8211; Persistence layer &#8211; writing entities and configuring Hibernate"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some generated code.<\/p>\n<p>Before we start, we need to update our Maven dependencies, because we will be using Hibernate and Spring now. Add following dependencies to your <strong>pom.xml<\/strong>:<\/p>\n<pre class=\"brush:xml\">  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.hibernate&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;hibernate-entitymanager&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.6.8.Final&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n                &lt;dependency&gt;\r\n   &lt;groupId&gt;mysql&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\r\n   &lt;version&gt;5.1.6&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n  \r\n  &lt;!-- spring framework --&gt;\r\n  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-context&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n                &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-test&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-jdbc&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-orm&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-webmvc&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-web&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;\r\n                &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-web&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;<\/pre>\n<p>If you\u2019re new to Maven you might be wondering now \u2013 how do you know these? Where can I get them? Well, just go to <a href=\"http:\/\/mvnrepository.com\/\">http:\/\/mvnrepository.com\/<\/a> and type what your ale looking for. You will get complete code for maven dependencies. If you have ever tried to assemble Spring or Hibernate application yourself without using Maven, you probably know how painful it was. With Maven things are so much easier.<\/p>\n<p>Also note, that we have included dependency to MySQL\u2019s connector. If you\u2019ve decided to use other database, don\u2019t forget to change this.          <\/p>\n<p>With Hibernate we have 2 options how to turn our POJOs to entites. Either we use XML and create <strong>mapping files<\/strong>, or we will put some <strong>meta information<\/strong> to our code (java annotations). Some people are afraid of those and consider this as coupling with framework. It is true that you will need <i>javax.persistence<\/i> annotations at your classpath, but we won\u2019t be implementing interfaces or extending framework classes. We will just add some meta information to our code and POJOs will still be simply POJOs with some extra information.<\/p>\n<p>We will turn our POJOs to entities now. We will need to do following changes:         <\/p>\n<ul>\n<li> Add default no-args constructor for Hibernate <\/li>\n<li> Create getters and setters for fields <\/li>\n<li> add <strong>equals<\/strong> and <strong>hashCode<\/strong> methods. <\/li>\n<li> Add persistence annotations. Note that we also use @Table annotation to distinguish between Java and SQL naming conventions. <\/li>\n<li> Add id fields. These will be primary keys in our relational database.<\/li>\n<\/ul>\n<p>This is quite lot of boilerplate code, so let your IDE help you. Most modern IDEs will generate construcors, getters, setters, equals and hashCode for you.<\/p>\n<pre class=\"brush:java\">package org.timesheet.domain;\r\n\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.Table;\r\n\r\n@Entity\r\n@Table(name = 'employee')\r\npublic class Employee {\r\n\r\n @Id\r\n @GeneratedValue(strategy=GenerationType.IDENTITY)\r\n private Long id;\r\n private String name;\r\n private String department;\r\n \r\n public Employee() {\r\n }\r\n\r\n public Employee(String name, String department) {\r\n  this.name = name;\r\n  this.department = department;\r\n }\r\n \r\n public String getName() {\r\n  return name;\r\n }\r\n \r\n public String getDepartment() {\r\n  return department;\r\n }\r\n \r\n public Long getId() {\r\n  return id;\r\n }\r\n \r\n public void setId(Long id) {\r\n  this.id = id;\r\n }\r\n\r\n public void setName(String name) {\r\n  this.name = name;\r\n }\r\n\r\n public void setDepartment(String department) {\r\n  this.department = department;\r\n }\r\n\r\n @Override\r\n public String toString() {\r\n  return 'Employee [id=' + id + ', name=' + name + ', department='\r\n    + department + ']';\r\n }\r\n\r\n @Override\r\n public int hashCode() {\r\n  final int prime = 31;\r\n  int result = 1;\r\n  result = prime * result\r\n    + ((department == null) ? 0 : department.hashCode());\r\n  result = prime * result + ((id == null) ? 0 : id.hashCode());\r\n  result = prime * result + ((name == null) ? 0 : name.hashCode());\r\n  return result;\r\n }\r\n\r\n @Override\r\n public boolean equals(Object obj) {\r\n  if (this == obj) {\r\n   return true;\r\n  }\r\n  if (obj == null) {\r\n   return false;\r\n  }\r\n  if (!(obj instanceof Employee)) {\r\n   return false;\r\n  }\r\n  Employee other = (Employee) obj;\r\n  if (department == null) {\r\n   if (other.department != null) {\r\n    return false;\r\n   }\r\n  } else if (!department.equals(other.department)) {\r\n   return false;\r\n  }\r\n  if (id == null) {\r\n   if (other.id != null) {\r\n    return false;\r\n   }\r\n  } else if (!id.equals(other.id)) {\r\n   return false;\r\n  }\r\n  if (name == null) {\r\n   if (other.name != null) {\r\n    return false;\r\n   }\r\n  } else if (!name.equals(other.name)) {\r\n   return false;\r\n  }\r\n  return true;\r\n }\r\n \r\n}<\/pre>\n<pre class=\"brush:java\">package org.timesheet.domain;\r\n\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.Table;\r\n\r\n@Entity\r\n@Table(name = 'manager')\r\npublic class Manager {\r\n \r\n @Id\r\n @GeneratedValue(strategy=GenerationType.IDENTITY)\r\n private Long id;\r\n private String name;\r\n \r\n public Manager() {\r\n }\r\n\r\n public Manager(String name) {\r\n  this.name = name;\r\n }\r\n \r\n public String getName() {\r\n  return name;\r\n }\r\n\r\n public Long getId() {\r\n  return id;\r\n }\r\n\r\n public void setId(Long id) {\r\n  this.id = id;\r\n }\r\n\r\n public void setName(String name) {\r\n  this.name = name;\r\n }\r\n\r\n @Override\r\n public int hashCode() {\r\n  final int prime = 31;\r\n  int result = 1;\r\n  result = prime * result + ((id == null) ? 0 : id.hashCode());\r\n  result = prime * result + ((name == null) ? 0 : name.hashCode());\r\n  return result;\r\n }\r\n\r\n @Override\r\n public boolean equals(Object obj) {\r\n  if (this == obj) {\r\n   return true;\r\n  }\r\n  if (obj == null) {\r\n   return false;\r\n  }\r\n  if (!(obj instanceof Manager)) {\r\n   return false;\r\n  }\r\n  Manager other = (Manager) obj;\r\n  if (id == null) {\r\n   if (other.id != null) {\r\n    return false;\r\n   }\r\n  } else if (!id.equals(other.id)) {\r\n   return false;\r\n  }\r\n  if (name == null) {\r\n   if (other.name != null) {\r\n    return false;\r\n   }\r\n  } else if (!name.equals(other.name)) {\r\n   return false;\r\n  }\r\n  return true;\r\n }\r\n\r\n @Override\r\n public String toString() {\r\n  return 'Manager [id=' + id + ', name=' + name + ']';\r\n }\r\n \r\n}<\/pre>\n<pre class=\"brush:java\">package org.timesheet.domain;\r\n\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\nimport javax.persistence.JoinColumn;\r\nimport javax.persistence.OneToOne;\r\nimport javax.persistence.Table;\r\n\r\n@Entity\r\n@Table(name='timesheet')\r\npublic class Timesheet {\r\n\r\n @Id\r\n @GeneratedValue(strategy=GenerationType.IDENTITY)\r\n private Long id;\r\n \r\n @OneToOne\r\n @JoinColumn(name = 'employee_id')\r\n private Employee who;\r\n \r\n @OneToOne\r\n @JoinColumn(name = 'task_id')\r\n private Task task;\r\n private Integer hours;\r\n \r\n public Timesheet() {\r\n }\r\n \r\n public Timesheet(Employee who, Task task, Integer hours) {\r\n  this.who = who;\r\n  this.task = task;\r\n  this.hours = hours;\r\n }\r\n\r\n public Employee getWho() {\r\n  return who;\r\n }\r\n\r\n public Task getTask() {\r\n  return task;\r\n }\r\n \r\n public Integer getHours() {\r\n  return hours;\r\n }\r\n \r\n public Long getId() {\r\n  return id;\r\n }\r\n\r\n public void setId(Long id) {\r\n  this.id = id;\r\n }\r\n\r\n public void setWho(Employee who) {\r\n  this.who = who;\r\n }\r\n\r\n public void setTask(Task task) {\r\n  this.task = task;\r\n }\r\n\r\n public void setHours(Integer hours) {\r\n  this.hours = hours;\r\n }\r\n\r\n \/**\r\n  * Manager can alter hours before closing task\r\n  * @param hours New amount of hours\r\n  *\/\r\n public void alterHours(Integer hours) {\r\n  this.hours = hours;\r\n }\r\n\r\n @Override\r\n public String toString() {\r\n  return 'Timesheet [id=' + id + ', who=' + who + ', task=' + task\r\n    + ', hours=' + hours + ']';\r\n }\r\n\r\n @Override\r\n public int hashCode() {\r\n  final int prime = 31;\r\n  int result = 1;\r\n  result = prime * result + ((hours == null) ? 0 : hours.hashCode());\r\n  result = prime * result + ((id == null) ? 0 : id.hashCode());\r\n  result = prime * result + ((task == null) ? 0 : task.hashCode());\r\n  result = prime * result + ((who == null) ? 0 : who.hashCode());\r\n  return result;\r\n }\r\n\r\n @Override\r\n public boolean equals(Object obj) {\r\n  if (this == obj) {\r\n   return true;\r\n  }\r\n  if (obj == null) {\r\n   return false;\r\n  }\r\n  if (!(obj instanceof Timesheet)) {\r\n   return false;\r\n  }\r\n  Timesheet other = (Timesheet) obj;\r\n  if (hours == null) {\r\n   if (other.hours != null) {\r\n    return false;\r\n   }\r\n  } else if (!hours.equals(other.hours)) {\r\n   return false;\r\n  }\r\n  if (id == null) {\r\n   if (other.id != null) {\r\n    return false;\r\n   }\r\n  } else if (!id.equals(other.id)) {\r\n   return false;\r\n  }\r\n  if (task == null) {\r\n   if (other.task != null) {\r\n    return false;\r\n   }\r\n  } else if (!task.equals(other.task)) {\r\n   return false;\r\n  }\r\n  if (who == null) {\r\n   if (other.who != null) {\r\n    return false;\r\n   }\r\n  } else if (!who.equals(other.who)) {\r\n   return false;\r\n  }\r\n  return true;\r\n }\r\n}<\/pre>\n<p>And finally, here\u2019s Task entity when we needed to use also @ManyToMany mapping. That\u2019s because one employee can work on multiple tasks and one task can have assigned multiple employees. We\u2019ve defined how our <strong>m:n<\/strong> will look like, using @JoinTable and @JoinColumn annotations.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">package org.timesheet.domain;\r\n\r\nimport javax.persistence.*;\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\nimport java.util.List;\r\n\r\n@Entity\r\n@Table(name = 'task')\r\npublic class Task {\r\n\r\n    @Id\r\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\r\n    private Long id;\r\n\r\n    @ManyToMany(fetch = FetchType.EAGER)\r\n    @JoinTable(name = 'task_employee',\r\n            joinColumns = {@JoinColumn(name = 'task_id')},\r\n            inverseJoinColumns = {@JoinColumn(name = 'employee_id')}\r\n    )\r\n    private List&lt;Employee&gt; assignedEmployees = new ArrayList&lt;Employee&gt;();\r\n\r\n    @OneToOne\r\n    @JoinColumn(name = 'manager_id')\r\n    private Manager manager;\r\n\r\n    private String description;\r\n    boolean completed;\r\n\r\n    public Task() {\r\n    }\r\n\r\n    public Task(String description, Manager manager, Employee... employees) {\r\n        this.description = description;\r\n        this.manager = manager;\r\n        assignedEmployees.addAll(Arrays.asList(employees));\r\n        completed = false;\r\n    }\r\n\r\n    public Manager getManager() {\r\n        return manager;\r\n    }\r\n\r\n    public List&lt;Employee&gt; getAssignedEmployees() {\r\n        return assignedEmployees;\r\n    }\r\n\r\n    public void addEmployee(Employee e) {\r\n        assignedEmployees.add(e);\r\n    }\r\n\r\n    public void removeEmployee(Employee e) {\r\n        assignedEmployees.remove(e);\r\n    }\r\n\r\n    public Long getId() {\r\n        return id;\r\n    }\r\n\r\n    public void setId(Long id) {\r\n        this.id = id;\r\n    }\r\n\r\n    public boolean isCompleted() {\r\n        return completed;\r\n    }\r\n\r\n    public void setCompleted(boolean completed) {\r\n        this.completed = completed;\r\n    }\r\n\r\n    public void setAssignedEmployees(List&lt;Employee&gt; assignedEmployees) {\r\n        this.assignedEmployees = assignedEmployees;\r\n    }\r\n\r\n    public void setManager(Manager manager) {\r\n        this.manager = manager;\r\n    }\r\n\r\n    public String getDescription() {\r\n        return description;\r\n    }\r\n\r\n    public void setDescription(String description) {\r\n        this.description = description;\r\n    }\r\n\r\n    @Override\r\n    public boolean equals(Object o) {\r\n        if (this == o) {\r\n            return true;\r\n        }\r\n        if (o == null || getClass() != o.getClass()) {\r\n            return false;\r\n        }\r\n\r\n        Task task = (Task) o;\r\n\r\n        if (completed != task.completed) {\r\n            return false;\r\n        }\r\n        if (description != null ? !description.equals(task.description) : task.description != null) {\r\n            return false;\r\n        }\r\n        if (id != null ? !id.equals(task.id) : task.id != null) {\r\n            return false;\r\n        }\r\n        if (manager != null ? !manager.equals(task.manager) : task.manager != null) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    @Override\r\n    public int hashCode() {\r\n        int result = id != null ? id.hashCode() : 0;\r\n        result = 31 * result + (manager != null ? manager.hashCode() : 0);\r\n        result = 31 * result + (description != null ? description.hashCode() : 0);\r\n        result = 31 * result + (completed ? 1 : 0);\r\n        return result;\r\n    }\r\n\r\n    @Override\r\n    public String toString() {\r\n        return 'Task{' +\r\n                'id=' + id +\r\n                ', assignedEmployees=' + assignedEmployees +\r\n                ', manager=' + manager +\r\n                ', description='' + description + '\\'' +\r\n                ', completed=' + completed +\r\n                '}';\r\n    }\r\n}<\/pre>\n<p>So we didn\u2019t really do anything special to model. If you fancy some UML look at the following picture, relations are same as before.<\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/2.bp.blogspot.com\/-tFHCyqfzxWs\/UCJ7ClSXm9I\/AAAAAAAABNU\/aMSFFAYv9hw\/s1600\/02_uml.png\"><img decoding=\"async\" border=\"0\" height=\"252\" src=\"http:\/\/2.bp.blogspot.com\/-tFHCyqfzxWs\/UCJ7ClSXm9I\/AAAAAAAABNU\/aMSFFAYv9hw\/s320\/02_uml.png\" width=\"320\" \/><\/a><\/div>\n<p>Okay we have entites, now let\u2019s create database. Pick some tool for database management (even plain terminal is fine) and create timesheet database like so (by default mysql will install to \/usr\/local\/mysql\/bin\/mysql at Mac OS X):<\/p>\n<pre class=\"brush:java\">$ mysql -u root\r\nmysql &gt; create database timesheet;<\/pre>\n<p>If you\u2019ve ever configured Hibernate before you probably know, that you need quite many files and boilerplate code when dealing for example with SessionFactory. These things are much simpler with Spring.<\/p>\n<p>We will now create our first <strong>Spring Bean Configuration File<\/strong> \u2013 it\u2019s file where we register beans for Spring container. If I had to explain what\u2019s this file to someone who doesn\u2019t know what Spring is at all \u2013 it\u2019s kind of magic bag where Spring container can find objects.<\/p>\n<p>Modern IDEs will help you get all the XML namespaces right, for example you can see pictures from STS wizard. NetBeans has something similar and IntelliJ resolves namespaces on the fly.<\/p>\n<p>Name configuration file <strong>persistence-beans.xml<\/strong> and we will put it under <i>src\/main\/resources<\/i> folder.          <\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/4.bp.blogspot.com\/-gOOBb_0TptY\/UCJ7I0z4TGI\/AAAAAAAABNc\/9KzK0c7xAYU\/s1600\/02_select_namespaces.png\"><img decoding=\"async\" border=\"0\" height=\"200\" src=\"http:\/\/4.bp.blogspot.com\/-gOOBb_0TptY\/UCJ7I0z4TGI\/AAAAAAAABNc\/9KzK0c7xAYU\/s320\/02_select_namespaces.png\" width=\"320\" \/><\/a><\/div>\n<p>So setting up Hibernate, transactions, annotation config and so on is as simple as creating few beans in XML file. Alternatively, we can use Java Config for Spring, but XML configs are still used much more, so we\u2019ll stick to those. I don\u2019t want to discourage you from using Java Config though! XML config is <i>much much<\/i> more popular at this moment, but I can\u2019t guarantee that for the next few years.<br \/>\nI\u2019ve commented every bean to make sure you understand what we did there before proceeding. If you want to get some visual grasp of connections between beans you can again use some tooling \u2013 in STS it\u2019s called Bean Graph, in IntelliJ it\u2019s Dependencies. You can see sample of dependencies on the picture below.         <\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/4.bp.blogspot.com\/-WJAZRPN0fKI\/UCJ7PixsMLI\/AAAAAAAABOk\/Hf28SQ-fLpQ\/s1600\/02_beans_dependencies.png\"><img decoding=\"async\" border=\"0\" height=\"209\" src=\"http:\/\/4.bp.blogspot.com\/-WJAZRPN0fKI\/UCJ7PixsMLI\/AAAAAAAABOk\/Hf28SQ-fLpQ\/s320\/02_beans_dependencies.png\" width=\"320\" \/><\/a><\/div>\n<pre class=\"brush:xml\">&lt;?xml version='1.0' encoding='UTF-8'?&gt;\r\n&lt;beans xmlns='http:\/\/www.springframework.org\/schema\/beans'\r\n xmlns:xsi='http:\/\/www.w3.org\/2001\/XMLSchema-instance'\r\n xmlns:context='http:\/\/www.springframework.org\/schema\/context'\r\n xmlns:tx='http:\/\/www.springframework.org\/schema\/tx'\r\n xsi:schemaLocation='http:\/\/www.springframework.org\/schema\/beans \r\n http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\r\n  http:\/\/www.springframework.org\/schema\/context \r\n  http:\/\/www.springframework.org\/schema\/context\/spring-context-3.1.xsd\r\n  http:\/\/www.springframework.org\/schema\/tx \r\n  http:\/\/www.springframework.org\/schema\/tx\/spring-tx-3.1.xsd'&gt;\r\n \r\n &lt;!-- we can use annotations --&gt;\r\n &lt;context:annotation-config \/&gt;  \r\n \r\n &lt;!-- package to look for annotated classes --&gt;\r\n &lt;context:component-scan base-package='org.timesheet.service.impl' \/&gt;\r\n \r\n &lt;!-- we will manage transactions with annotations --&gt;\r\n &lt;tx:annotation-driven \/&gt;\r\n\r\n &lt;!-- data source for our database --&gt;\r\n &lt;bean id='dataSource' \r\n  class='org.springframework.jdbc.datasource.DriverManagerDataSource'&gt;\r\n  &lt;property name='driverClassName' \r\n   value='com.mysql.jdbc.jdbc2.optional.MysqlDataSource' \/&gt;\r\n  &lt;property name='url' value='jdbc:mysql:\/\/localhost\/timesheet' \/&gt;\r\n  &lt;property name='username' value='root' \/&gt;\r\n  &lt;property name='password' value='' \/&gt;\r\n &lt;\/bean&gt;\r\n \r\n &lt;!-- configure hibernate session factory --&gt;\r\n &lt;bean id='sessionFactory'\r\n  class='org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean'&gt;\r\n  &lt;property name='dataSource' ref='dataSource' \/&gt;\r\n  &lt;property name='annotatedClasses' &gt;\r\n   &lt;list&gt;\r\n    &lt;value&gt;org.timesheet.domain.Employee&lt;\/value&gt;\r\n    &lt;value&gt;org.timesheet.domain.Manager&lt;\/value&gt;\r\n    &lt;value&gt;org.timesheet.domain.Task&lt;\/value&gt;\r\n    &lt;value&gt;org.timesheet.domain.Timesheet&lt;\/value&gt;\r\n   &lt;\/list&gt;\r\n  &lt;\/property&gt;\r\n  &lt;property name='hibernateProperties'&gt;\r\n   &lt;props&gt;\r\n    &lt;prop key='dialect'&gt;org.hibernate.dialect.MySQL5InnoDBDialect&lt;\/prop&gt;\r\n    &lt;prop key='hibernate.show_sql'&gt;true&lt;\/prop&gt;\r\n    &lt;prop key='hibernate.hbm2ddl.auto'&gt;update&lt;\/prop&gt;\r\n   &lt;\/props&gt;\r\n  &lt;\/property&gt; \r\n &lt;\/bean&gt;\r\n \r\n&lt;\/beans&gt;\r\n<\/pre>\n<p>Okay, that was quite lot of configuration, he? What\u2019s not so good is that we\u2019ve placed names of our entities to XML as plain text, so it isn\u2019t refactoring friendly. But I think for this tutorial it\u2019s acceptable <img decoding=\"async\" alt=\":)\" src=\"http:\/\/s0.wp.com\/wp-includes\/images\/smilies\/icon_smile.gif?m=1129645325g\" \/> Let\u2019s write integration test for Hibernate so we know that everything is set up properly.<\/p>\n<pre class=\"brush:java\">package org.timesheet.integration;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\nimport org.hibernate.SessionFactory;\r\nimport org.junit.Test;\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.test.context.ContextConfiguration;\r\nimport org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;\r\n\r\n@ContextConfiguration(locations = '\/persistence-beans.xml')\r\npublic class HibernateConfigurationTest extends AbstractJUnit4SpringContextTests {\r\n \r\n @Autowired\r\n private SessionFactory sessionFactory;\r\n\r\n @Test\r\n public void testHibernateConfiguration() {\r\n  \/\/ Spring IOC container instantiated and prepared sessionFactory\r\n  assertNotNull (sessionFactory); \r\n }\r\n\r\n}<\/pre>\n<p>I want you to note 2 things here. First, we extend <i>AbstractJUnit4SpringContextTests<\/i> class. We tell it where it should look for actual XML config with spring beans. Otherwise we would have to create Spring container by ourselves, which means more boilerplate code.<\/p>\n<p>Second, we use @Autowired annotation. That means we don\u2019t create instance of <i>SessionFactory<\/i> by hand using <strong>new<\/strong> operator, but we will have it Autowired (Injected) by Spring container! That\u2019s one of the most important purposes of Spring container \u2013 depend on <strong>interfaces<\/strong> and have <strong>implementations injected<\/strong> instead of creating them by hand.<br \/>\nEverything should work now and I think that\u2019s enough for this part.<\/p>\n<p>If you like you can check plain SQL, and see tables are here, do it like so:<\/p>\n<pre class=\"brush:java\">mysql&gt; use timesheet;\r\nmysql&gt; show tables;\r\n+---------------------+\r\n| Tables_in_timesheet |\r\n+---------------------+\r\n| employee            |\r\n| manager             |\r\n| task                |\r\n| task_employee       |\r\n| timesheet           |\r\n+---------------------+\r\n5 rows in set (0.00 sec)\r\n<\/pre>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/vrtoonjava.wordpress.com\/2012\/06\/17\/part-2-persistence-layer-writing-entities-and-configuring-hibernate\/\">Part 2 \u2013 Persistence layer \u2013 writing entities and configuring Hibernate<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Michal Vrtiak at the <a href=\"http:\/\/vrtoonjava.wordpress.com\/\">vrtoonjava<\/a> blog.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some generated code. Before we start, we need to update our Maven dependencies, because we will be using Hibernate and Spring now. Add following dependencies to your &hellip;<\/p>\n","protected":false},"author":242,"featured_media":240,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[31,30],"class_list":["post-1800","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jboss-hibernate","tag-spring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring - Persistence layer - writing entities and configuring Hibernate - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring - Persistence layer - writing entities and configuring Hibernate - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-09-19T11:32:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-22T06:49:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Michal Vrtiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michal Vrtiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html\"},\"author\":{\"name\":\"Michal Vrtiak\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/813b2013cd445be1ca64dda08f9e4ca3\"},\"headline\":\"Spring &#8211; Persistence layer &#8211; writing entities and configuring Hibernate\",\"datePublished\":\"2012-09-19T11:32:00+00:00\",\"dateModified\":\"2012-10-22T06:49:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html\"},\"wordCount\":919,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"keywords\":[\"JBoss Hibernate\",\"Spring\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html\",\"name\":\"Spring - Persistence layer - writing entities and configuring Hibernate - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"datePublished\":\"2012-09-19T11:32:00+00:00\",\"dateModified\":\"2012-10-22T06:49:14+00:00\",\"description\":\"Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"spring-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-persistence-layer-writing.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring &#8211; Persistence layer &#8211; writing entities and configuring Hibernate\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/813b2013cd445be1ca64dda08f9e4ca3\",\"name\":\"Michal Vrtiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g\",\"caption\":\"Michal Vrtiak\"},\"description\":\"Michal is a freelancer currently located in Prague, Czech Republic with huge passion for Java platform. He is very enthusiastic about Dependency Injection, IntelliJ IDEA and loves to use both Spring and Java EE.\",\"sameAs\":[\"http:\\\/\\\/vrtoonjava.wordpress.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Michal-Vrtiak\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring - Persistence layer - writing entities and configuring Hibernate - Java Code Geeks","description":"Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html","og_locale":"en_US","og_type":"article","og_title":"Spring - Persistence layer - writing entities and configuring Hibernate - Java Code Geeks","og_description":"Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some","og_url":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-09-19T11:32:00+00:00","article_modified_time":"2012-10-22T06:49:14+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","type":"image\/jpeg"}],"author":"Michal Vrtiak","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Michal Vrtiak","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html"},"author":{"name":"Michal Vrtiak","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/813b2013cd445be1ca64dda08f9e4ca3"},"headline":"Spring &#8211; Persistence layer &#8211; writing entities and configuring Hibernate","datePublished":"2012-09-19T11:32:00+00:00","dateModified":"2012-10-22T06:49:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html"},"wordCount":919,"commentCount":3,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","keywords":["JBoss Hibernate","Spring"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html","url":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html","name":"Spring - Persistence layer - writing entities and configuring Hibernate - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","datePublished":"2012-09-19T11:32:00+00:00","dateModified":"2012-10-22T06:49:14+00:00","description":"Welcome to the second part of this tutorial. Don\u2019t freak out when you see how long this article is \u2013 I promise you it\u2019s mostly easy POJOs and some","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-logo.jpg","width":150,"height":150,"caption":"spring-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-persistence-layer-writing.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Spring &#8211; Persistence layer &#8211; writing entities and configuring Hibernate"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/813b2013cd445be1ca64dda08f9e4ca3","name":"Michal Vrtiak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g","caption":"Michal Vrtiak"},"description":"Michal is a freelancer currently located in Prague, Czech Republic with huge passion for Java platform. He is very enthusiastic about Dependency Injection, IntelliJ IDEA and loves to use both Spring and Java EE.","sameAs":["http:\/\/vrtoonjava.wordpress.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Michal-Vrtiak"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1800"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1800\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/240"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}