Wednesday, June 12, 2013

11 - Configuring Collections and Adding Keys


@JoinTable(name="USER_ADDRESS")
It is used to apply user defined table name.
It will change table name from "UserDetails_listOfAddresses" to "USER_ADDRESS"

@JoinTable(name="USER_ADDRESS",
                                   joinColumns=@JoinColumn(name="USER_ID")
)
By using above annotation you can change column name in USER_ADDRESS table

USER_ADDRESS doesn’t have primary key, in order to use primary key you need to change HashSet to ArrayList because HashSet doesn't have index.

@CollectionId
private Collection<Address> listOfAddresses = new ArrayList<Address>();

@CollectionId(column = { @Column }, generator = "", type = @Type)
This feature provided by hibernate alone, not from javax.persistence to generate primary key.
Column:  what is the column name you define as primary key.
eg: column = { @Column(name="ADDRESS_ID") }

generator: how is the primary key to be generated
Generator can be define using annotation @GenericGenerator(name="hilo-gen", strategy="hilo")
hilo is one type of generator which hibernate provides

type:  what is the type of primary key. It is specific to hibernate not to JPA
eg: type=@Type(type="long")

HibernateTest.java
package org.yash.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.yash.dto.Address;
import org.yash.dto.UserDetails;

public class HibernateTest {

      public static void main(String args[]){
            UserDetails user = new UserDetails();
            user.setUserName("First User");

            UserDetails user2 = new UserDetails();
            user2.setUserName("Second User");
           
            Address addr1 = new Address();
            addr1.setCity("Bentonville");
            addr1.setPincode("72712");
            addr1.setState("Ar");
            addr1.setStreet("2301 SE Saint Andrews");
           
            Address addr2 = new Address();
            addr2.setCity("Rogers");
            addr2.setPincode("72713");
            addr2.setState("AR");
            addr2.setStreet("2303 SE Saint Andrews");
           
            user.getListOfAddresses().add(addr1);
            user.getListOfAddresses().add(addr2);
           
            SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();         
            Session session = sessionFactory.openSession();
            /* It is used to save all the objects and to define single unit of work */
            session.beginTransaction();
           
            session.save(user);
            //session.save(user2);
            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());

      }
}


UserDetails.java

package org.yash.dto;

import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.Table;
import javax.persistence.JoinColumn;
import javax.persistence.Column;

import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;

@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;
      @ElementCollection
      @JoinTable(name="USER_ADDRESS",
                   joinColumns=@JoinColumn(name="USER_ID")
     )
     @GenericGenerator(name="hilo-gen", strategy="hilo")
/* hilo is a one type of generator in hibernate */
     @CollectionId (columns = { @Column(name="ADDRESS_ID") }, generator = "hilo-gen", type = @Type(type="long"))
/*It is specific to hibernate not to JPA*/
      private Collection<Address> listOfAddresses = new ArrayList<Address>();
     
      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 void setListOfAddresses(Collection<Address> listOfAddresses) {
            this.listOfAddresses = listOfAddresses;
      }
      public Collection<Address> getListOfAddresses() {
            return listOfAddresses;
      }
}


Address.java
package org.yash.dto;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Address {
      @Column(name="STREET_NAME")
      private String street;
      @Column(name="CITY_NAME")
      private String city;
      @Column(name="STATE_NAME")
      private String state;
      @Column(name="PIN_CODE")
      private String pincode;
     
      public String getStreet() {
            return street;
      }
      public void setStreet(String street) {
            this.street = street;
      }
      public String getCity() {
            return city;
      }
      public void setCity(String city) {
            this.city = city;
      }
      public String getState() {
            return state;
      }
      public void setState(String state) {
            this.state = state;
      }
      public String getPincode() {
            return pincode;
      }
      public void setPincode(String pincode) {
            this.pincode = pincode;
      }
     
}


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>

No comments:

Post a Comment