Tuesday, June 11, 2013

07 - Primary-Keys



What are the different way hibernate provide support for primary keys?
Natural key and Surrogate Key

Natural key: Keys are natural if the attribute it represents is used for identification independently of the database schema.  What this basically means is that the keys are natural if people use them example: username, email id etc
Surrogate Key: Surrogate keys are keys that have no “business” meaning and are solely used to identify a record in the table.  Such keys are either database generated (example: Identity in SQL Server, Sequence in Oracle, Sequence/Identity in DB2 UDB etc.) or system generated values (like generated via a table in the schema).

@Id @GeneratedValue(strategy=GenerationType.AUTO)
It is used to generate auto incremented id eg: 1,2,3,4.....

                @Id @GeneratedValue (strategy=GenerationType.AUTO) -> recommended option
                @Id @GeneratedValue (strategy=GenerationType.IDENTITY)
                @Id @GeneratedValue (strategy=GenerationType.SEQUENCE)
                @Id @GeneratedValue (strategy=GenerationType.TABLE)
AUTO: Indicates that the persistence provider should pick an appropriate strategy for the particular database.
IDENTITY: Indicates that the persistence provider must assign primary keys for the entity using database identity column.
SEQUENCE: Indicates that the persistence provider must assign primary keys for the entity using database sequence column.
TABLE: Indicates that the persistence provider must assign primary keys for the entity using an underlying database table to ensure uniqueness.

***************************************************************
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <property name="connection.driver_class">
            org.postgresql.Driver
        </property>
        <property name="connection.url">
            jdbc:postgresql://localhost:5433/hibernatedb
        </property>
        <property name="connection.username">postgres</property>
        <property name="connection.password">admin</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">
            org.hibernate.dialect.PostgreSQLDialect
        </property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>
       
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
       
        <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">create</property> 
<!-- create / update -->
   
          <!-- Names the annotated entity class -->
            <mapping class="org.yash.dto.UserDetails"/>    

    </session-factory>
</hibernate-configuration>

UserDetails.java
package org.yash.dto;

import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="USER_DETAILS")
public class UserDetails {
      /* @Id says "userId" is primary key */
      @Id @GeneratedValue (strategy=GenerationType.AUTO)
      private int userId;    
      private String userName;
      private Date joinedDate;
      private String Address;
      private String description;
     
      public int getUserId() {
            return userId;
      }
      public void setUserId(int userId) {
            this.userId = userId;
      }
      public String getUserName() {
            return userName;
      }
      public void setUserName(String userName) {
            this.userName = userName;
      }

      public Date getJoinedDate() {
            return joinedDate;
      }
      public void setJoinedDate(Date joinedDate) {
            this.joinedDate = joinedDate;
      }
      public String getAddress() {
            return Address;
      }
      public void setAddress(String address) {
            Address = address;
      }
      public String getDescription() {
            return description;
      }
      public void setDescription(String description) {
            this.description = description;
      }
}

HibernateTest.java
package org.yash.hibernate;

import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.yash.dto.UserDetails;

public class HibernateTest {

      public static void main(String args[]){
            UserDetails user = new UserDetails();
            user.setUserName("Third User");
            user.setAddress("Bentonville");
            user.setJoinedDate(new Date());
            user.setDescription("Description of user goes here");
           
            SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
           
            Session session = sessionFactory.openSession();
            session.beginTransaction();
           
            session.save(user);
            session.getTransaction().commit();
           
            user = null;
           
            session = sessionFactory.openSession();
            session.beginTransaction();
            user = (UserDetails) session.get(UserDetails.class, 1);
            System.out.println("User name retrieved is "+user.getUserName());

      }
}
  
************************************

No comments:

Post a Comment