title: HIbernate Annotations @GeneratedValue difference between the strategy type
body: <p>I am new to Hibernate Framework. I am using Hibernate 5 with MySQL 5.7.14-log.</p>
  
  <p>I am learning about Primary keys @Id @GeneratedValue. I have tried the generation type strategies ie AUTO, SEQUENCE, IDENTITY, TABLE.</p>
  
  <p>The following is my observations about AUTO, SEQUENCE, TABLE 
  The result of the creation is as follows</p>
  
  <pre><code>    @Id @GeneratedValue
  Hibernate: drop table if exists hibernate_sequence
  Hibernate: drop table if exists USER_DETAILS
  Hibernate: create table hibernate_sequence (next_val bigint)
  Hibernate: insert into hibernate_sequence values ( 1 )
  Hibernate: create table USER_DETAILS (userId integer not null, address varchar(255), joiningDate date, userName varchar(255), primary key (userId))
  Hibernate: select next_val as id_val from hibernate_sequence for update
  Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  Hibernate: select next_val as id_val from hibernate_sequence for update
  Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  Hibernate: insert into USER_DETAILS (address, joiningDate, userName, userId) values (?, ?, ?, ?)
  Hibernate: insert into USER_DETAILS (address, joiningDate, userName, userId) values (?, ?, ?, ?)
  Hibernate: select userdetail0_.userId as userId1_0_0_, userdetail0_.address as address2_0_0_, userdetail0_.joiningDate as joiningD3_0_0_, userdetail0_.userName as userName4_0_0_ from USER_DETAILS userdetail0_ where userdetail0_.userId=?
  UserDetails [userId=1, userName=First user, address=Adddress, joiningDate=2016-12-04]
  
      @Id @GeneratedValue(strategy=GenerationType.AUTO)
  Hibernate: drop table if exists hibernate_sequence
  Hibernate: drop table if exists USER_DETAILS
  Hibernate: create table hibernate_sequence (next_val bigint)
  Hibernate: insert into hibernate_sequence values ( 1 )
  Hibernate: create table USER_DETAILS (userId integer not null, address varchar(255), joiningDate date, userName varchar(255), primary key (userId))
  Hibernate: select next_val as id_val from hibernate_sequence for update
  Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  Hibernate: select next_val as id_val from hibernate_sequence for update
  Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  Hibernate: insert into USER_DETAILS (address, joiningDate, userName, userId) values (?, ?, ?, ?)
  Hibernate: insert into USER_DETAILS (address, joiningDate, userName, userId) values (?, ?, ?, ?)
  Hibernate: select userdetail0_.userId as userId1_0_0_, userdetail0_.address as address2_0_0_, userdetail0_.joiningDate as joiningD3_0_0_, userdetail0_.userName as userName4_0_0_ from USER_DETAILS userdetail0_ where userdetail0_.userId=?
  UserDetails [userId=1, userName=First user, address=Adddress, joiningDate=2016-12-04]
  
      @Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
  Hibernate: drop table if exists hibernate_sequence
  Hibernate: drop table if exists USER_DETAILS
  Hibernate: create table hibernate_sequence (next_val bigint)
  Hibernate: insert into hibernate_sequence values ( 1 )
  Hibernate: create table USER_DETAILS (userId integer not null, address varchar(255), joiningDate date, userName varchar(255), primary key (userId))
  Hibernate: select next_val as id_val from hibernate_sequence for update
  Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  Hibernate: select next_val as id_val from hibernate_sequence for update
  Hibernate: update hibernate_sequence set next_val= ? where next_val=?
  Hibernate: insert into USER_DETAILS (address, joiningDate, userName, userId) values (?, ?, ?, ?)
  Hibernate: insert into USER_DETAILS (address, joiningDate, userName, userId) values (?, ?, ?, ?)
  Hibernate: select userdetail0_.userId as userId1_0_0_, userdetail0_.address as address2_0_0_, userdetail0_.joiningDate as joiningD3_0_0_, userdetail0_.userName as userName4_0_0_ from USER_DETAILS userdetail0_ where userdetail0_.userId=?
  UserDetails [userId=1, userName=First user, address=Adddress, joiningDate=2016-12-04]
  </code></pre>
  
  <p>GenerationType.AUTO/SEQUENCE give the same result(ie create a new table hibernate_sequence). Whereas TABLE creates a table hibernate_sequences</p>
  
  <p>I have the following queries.</p>
  
  <ol>
  <li><p>Is there any difference between AUTO and SEQUENCE. IF yes, then whats the difference and which DBs are they specific to? </p></li>
  <li><p>What is the default strategy for MySQL?</p></li>
  <li><p>For GenerationType.TABLE, hibernate_sequences table is created with 2 columns, sequence_name and next_val. What does the sequence_name column indicate. [Current value is default]</p></li>
  </ol>
  
  <p>Here is my POJO class</p>
  
  <pre><code>@Entity (name="USER_DETAILS")
  public class UserDetails
  {
      @Id @GeneratedValue
      private int     userId;
      private String  userName;   
      private String address;
  
      @Temporal (TemporalType.DATE)
      private Date joiningDate;
  
      public String getAddress()
      {
          return address;
      }
  
      public void setAddress(String address)
      {
          this.address = address;
      }
  
      public Date getJoiningDate()
      {
          return joiningDate;
      }
  
      public void setJoiningDate(Date joiningDate)
      {
          this.joiningDate = joiningDate;
      }
  
      public int getUserId()
      {
          return userId;
      }
  
      public void setUserId(int userId)
      {
          this.userId = userId;
      }
  
      public String getUserName()
      {
          return userName + " from getter";
      }
  
      public void setUserName(String userName)
      {
          this.userName = userName;
      }
  }
  </code></pre>
  
  <p>I have searched online but I have got confused even more.
  Links seen</p>
  
  <p><a href="https://stackoverflow.com/questions/14022374/the-differences-between-generatedvalue-strategies">The differences between GeneratedValue strategies</a></p>
  
  <p><a href="http://docs.oracle.com/javaee/5/api/javax/persistence/GenerationType.html" rel="nofollow noreferrer">http://docs.oracle.com/javaee/5/api/javax/persistence/GenerationType.html</a></p>