Archive

Archive for December, 2013

Hibernate Fetching Strategy

December 29, 2013 Leave a comment

Hibernate mempunyai empat fetching strategy:

  • Fetch Strategy : SELECT
  • Fetch Strategy : JOIN
  • Fetch Strategy : SUBSELECT
  • Fetch Strategy : BATCH

Example mempunyai dua entity yaitu Player dan Club dengan relation OneToMany. Lebih lengkapnya di post ini.

Entity Player :

/* Import some class from library */

@Entity
@Table(name="player")
public class Player {
@Id
@GeneratedValue
@Column(name="id_player")
private int idPlayer;
@Column(name="player_name")
private String playerName;
@Column(name="country")
private String country;
@Column(name="position")
private String position;

@ManyToOne
@JoinColumn(name="fk_id_club", referencedColumnName="id")
private Club club;

/*setter getter method */

}

Entity Club :

/* Import some class from library */
@Entity
@Table(name="club")
public class Club implements Serializable {

@Id
@GeneratedValue
@Column(name="id")
private int id;

@Column(name="club_name")
private String clubName;
@Column(name="country")
private String country;

@OneToMany(mappedBy="club")
private List<Player> player;
/*setter getter method */
}

Main class untuk retrieve record Club dan Player.

/* Import some class from library */
public class OneToMany {
public static void main(String[] args) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();

Query query = session.createQuery("from Club");
List listClub = query.list();

Iterator iterator = listClub.iterator();
while (iterator.hasNext()){
Club club = (Club) iterator.next();
System.out.println("Club Name:"+ club.getClubName());
System.out.println("Country: "+ club.getCountry());
Iterator pIterator = club.getPlayer().iterator();
System.out.println("*****");
while(pIterator.hasNext()){
Player player = (Player)pIterator.next();
System.out.println("Player Name: "+player.getPlayerName());
System.out.println("Player Position: "+ player.getPosition());
System.out.println("Player Country: "+player.getCountry());
}
System.out.println("-----");

}
session.getTransaction().commit();
session.close();
}
}

Fetch Strategy : SELECT
Merupakan default fetch strategy Hibernate dengan default FetchType.LAZY. console output yang dihasilkan sebagai berikut.

Select Output Console

Select Output Console

Terdapat lima query yang dihasilkan, satu query untuk men-retrieve semua record pada table Club. sedang empat query lainnya untuk men-retrive record pada table Player per Club. Ini yang disebut N+1 problem.

Fetch Strategy : JOIN
Pada property player pada entity Club tambahkan annotation sebagai berikut

......
@Fetch(FetchMode.JOIN)
@OneToMany(mappedBy="club")
private List<Player> player;
......

Dan pada Main class, untuk men-retrieve record menggunakan Criteria bukan HQL. Jika menggunakan HQL, query outer join harus eksplisit atau FetchMode.JOIN annotation akan diabaikan.

......
Criteria criteria = session.createCriteria(Club.class);
List listClub = criteria.list();
......

Console output yang dihasilkan sebagai berikut.

Join Output Console

Join Output Console

Semua data di-retrieve dengan satu query, dan query yang dihasilkan Hibernate merupakan outer join antara entity Club dan Player.

Fetch Strategy : SUBSELECT
Pada property player pada entity Club tambahkan annotation sebagai berikut

......
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy="club")
private List<Player> player;
......

Console output yang dihasilkan sebagai berikut.

Subselect Output Console

Subselect Output Console

Dengan FetchMode.SUBSELECT, Hibernate menghasil dua query.
Satu query untuk men-retrieve record entity Club, dan query kedua menggunakan subselect query pada clause where untuk men-retrieve semua Player yang mempunyai fk_id_club yang sama.

Fetch Strategy : BATCH

Pada property player pada entity Club tambahkan annotation sebagai berikut

......
@BatchSize(size=2)
@OneToMany(mappedBy="club")
private List<Player> player;
......

Console output yang dihasilkan sebagai berikut.

Batch Console Output

Batch Console Output

Batch-size fetching strategy tidak untuk menentukan berapa banyak record dalam collection yang di-retrieve. Sebaliknya, mendefinisikan jumlah collection yang di-retrieve.

Referensi : dari berbagai sumber.
Semoga bermanfaat.

FetchType Lazy dan Eager Pada Hibernate

December 27, 2013 Leave a comment

FetchType pada Hibernate berfungsi untuk menentukan  apakah atau tidak untuk me-load semua collection object ( child ) sesaat setelah object parent di-fetch. Pada Hibernate terdapat dua jenis FetchType yaitu :

  • FetchType.LAZY : Hibernate tidak men-load semua collecton object ( child ) saat object parent di-fetch. Collection object (child) hanya di-load jika secara eksplisit dibutuhkan via getter method.
  • FetchType.EAGER : Hibernate men-load semua collection object ( child ) sesaat setelah object parent di-fetch.

Pada example dibawah ini terdapat dua entity yaitu Player dan Club dengan relation OneToMany.

Entity Player :

@Entity
@Table(name="player")
public class Player {
@Id
@GeneratedValue
@Column(name="id_player")
private int idPlayer;
@Column(name="player_name")
private String playerName;
@Column(name="country")
private String country;
@Column(name="position")
private String position;

@ManyToOne
@JoinColumn(name="fk_id_club", referencedColumnName="id")
private Club club;

//Getter and Setter method

}

Entity Club :

@Entity
@Table(name="club")
public class Club implements Serializable {

@Id
@GeneratedValue
@Column(name="id")
private int id;

@Column(name="club_name")
private String clubName;
@Column(name="country")
private String country;

@OneToMany(fetch = FetchType.EAGER, mappedBy="club")
private List<Player> player;

//Getter and Setter method

public List<Player> getPlayer() {
return player;
}

public void setPlayer(List<Player> player) {
this.player = player;
}

}

Pada example diatas saya menggunakan FetchType.EAGER, sehingga saat men-fetching satu Club maka semua collection object ( child ) berupa object Player juga akan didapatkan. Example untuk men-fetching Club dengan Id = 1.

public static void main(String[] args) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();

Club club = (Club) session.get(Club.class, 1);
session.getTransaction().commit();
session.close();
List <Player> listPlayer = club.getPlayer();
int totalPlayer = listPlayer.size();
for(int i=0; i<totalPlayer; i++){
System.out.println("Player Name: " +listPlayer.get(i).getPlayerName());
System.out.println("Player Position: " +listPlayer.get(i).getPosition());
System.out.println("Player Country: " +listPlayer.get(i).getCountry());
}
}

Pada example diatas, menampilkan semua collection child berupa object Player setelah session close. Karena menggunakan FetchType.EAGER maka code tersebut tidak menghasilkan exception.Ini menunjukkan saat men-fetch parent, semua collection object ikut di-fetch. Jika FetchType diset menjadi FetchType.LAZY, maka secara default collection child mempunyai nilai NULL kecuali nilai collection child diset secara ekplisit via getter method. Sehingga saat menampilkan sesudah session close maka akan menghasilkan exception. Example diambil dari post ini.

Default fetching strategi :
FetchType.EAGER : @OneToOne, @ManyToOne.
FetchType.LAZY     : @OneToMany, @ManyToMany

Referensi : dari berbagai sumber.
Semoga bermanfaat.

Hibernate Projections

December 22, 2013 Leave a comment

Return dari criteria secara default seluruh object (seluruh property dari object), untuk memperoleh partial object ( satu atau lebih property ) maka digunakan projections. Untuk menggunakan projection, import interface Projections dan class Projection keduanya berada pada paket org.hibernate.criterion. Projection class bersifat final dan semua method-nya static. Berikut ini contoh projection dan table yang digunakan sama dengan table pada post ini.

Criteria criteria = session.createCriteria(People.class);
Projection projection1 = Projections.property("name");
Projection projection2 = Projections.property("job");
ProjectionList pList = Projections.projectionList();
pList.add(projection2);
pList.add(projection1);
criteria.setProjection(pList);
List list = criteria.list();

Iterator iterator = list.iterator();
while(iterator.hasNext()){
Object o[] = (Object[])iterator.next();
System.out.println("Name: "+ o[1]);
System.out.println("Job : "+ o[0]);
}

Referensi : dari berbagai sumber
Semoga bermanfaat

Hibernate Criteria Example

December 15, 2013 Leave a comment

Criteria hanya digunakan untuk proses SELECT data dari database dan table yang digunakan sama dengan table pada post ini. Sama denga HQL, criteria menggunakan nama class dan property bukan nama table dan column.

Criteria criteria = session.createCriteria(People.class);

Criterion criterion2 = Restrictions.gt("id", 1);
Criterion criterion1 = Restrictions.le("id", 4);
Criterion criterion4 = Restrictions.ilike("name", "Ren%");
Criterion criterion5 = Restrictions.eq("job", "Artist");

Criterion criterion3 = Restrictions.or(criterion4, criterion5);
criteria.add(criterion1);
criteria.add(criterion2);
criteria.add(criterion3);
criteria.addOrder(Order.asc("id"));

List list = criteria.list();

Referensi : dari berbagai sumber.

Semoga bermanfaat.

HQL Sample

December 15, 2013 Leave a comment

Berikut ini example HQL  dan table yang digunakan sama dengan table pada post ini.

1. Example HQL select query

Query query=  session.createQuery("from People where id >:idPeople");
query.setParameter("idPeople",3);
List list = query.list();

2. Example HQL update query

query=  session.createQuery("update People set name= :namePeople, address.addressStreet =:addressStreetPeople, address.addressCity =:addressCityPeople, address.addressZipcode =:addressZipcodePeople  where id =:idPeople");
query.setParameter("namePeople", "Renata Putri");
query.setParameter("addressStreetPeople", "Taman Sari");
query.setParameter("addressCityPeople", "Bandung");
query.setParameter("addressZipcodePeople", "34599");
query.setParameter("idPeople",3);

query.executeUpdate();

3. Example HQL delete query

query=  session.createQuery("delete People where id >:idPeople");
query.setParameter("idPeople",3);
query.executeUpdate();

3. Example HQL insert query

Pada HQL tidak support INSERT INTO ( ) VALUES ( ) statement.

Semoga bermanfaat.

Referensi : dari berbagai sumber

Hibernate Component Mapping

December 14, 2013 Leave a comment

Berikut ini contoh component mapping menggunakan annotation pada Hibernate

1.Table

Table people

Table People

Table People

2. Entity Class

Address class ( component )

package pojo;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Address implements Serializable {
@Column(name="address_street")
private String addressStreet;
@Column(name="address_city")
private String addressCity;
@Column(name="address_zipcode")
private String addressZipcode;

public Address(){
}

public Address(String addressStreet, String addressCity, String addressZipcode){
this.addressStreet =addressStreet;
this.addressCity   = addressCity;
this.addressZipcode =addressZipcode;
}
public String getAddressStreet() {
return addressStreet;
}

public void setAddressStreet(String addressStreet) {
this.addressStreet = addressStreet;
}

public String getAddressCity() {
return addressCity;
}

public void setAddressCity(String addressCity) {
this.addressCity = addressCity;
}

public String getAddressZipcode() {
return addressZipcode;
}

public void setAddressZipcode(String addressZipcode) {
this.addressZipcode = addressZipcode;
}

}

People class

package pojo;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="people")
public class People {
@Id
@GeneratedValue
@Column(name="id")
private int id;
@Column(name="name")
private String name;
@Column(name="job")
private String job;
@Embedded
private Address address;

public People(){
}

public People(String name, String job, Address address){
this.name = name;
this.job = job;
this.address = address;
}
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getJob() {
return job;
}

public void setJob(String job) {
this.job = job;
}

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}
}

3. Hibernate Configuration File

<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jointrain?zeroDateTimeBehavior=convertToNull</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.show_sql">true</property>
<mapping clas="pojo.Address"/>
<mapping clas="pojo.People"/>
</session-factory>
</hibernate-configuration>

4. Hibernate Utility Class

package componentmapping;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

static SessionFactory getSessionFactory() {
return sessionFactory;
}
}

5. Main Class

package componentmapping;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import pojo.Address;
import pojo.People;

public class ComponentMapping {

public static void main(String[] args) {
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();

Address address= new Address("Tegal Parang","Jakarta","172111");
People people = new People("Kukuh Utama", "Programmer", address);

session.save(people);

session.getTransaction().commit();
session.close();
}
}

6. Project Structure

Project Structure

Project Structure

 
Referensi : dari berbagai sumber.
Semoga bermanfaat.

Lifecylce Object Pada Hibernate

December 8, 2013 Leave a comment

Pada Hibernate, object memiliki 3 jenis state.

1. Transient state

  • Object dimulai dengan transient stateO
  • Object tidak merepresentasikan row/data pada database
  • Hibernate tidak aware terhadap object ini, sehingga jika dilakukan modifikasi object tidak akan berpengaruh terhadap data di database

2. Persistent state

  • Object merepresentasikan row/data pada database
  • Object mempunyai database id
  • Hibernate aware terhadap object ini, sehingga jika dilakukan modifikasi object akan berpengaruh terhadap data di database
  • Mempunyai asosiasi dengan unique session

3. Detached state

  • Object merepresentasikan row/data pada database
  • Tidak mempunyai asosiasi dengan unique session
  • Method session.close(), mengubah object state dari persistent menjadi detached
  • Hibernate tidak aware terhadap object ini, sehingga jika dilakukan modifikasi object tidak akan berpengaruh terhadap data di database

Referensi : dari berbagai sumber.

Semoga bermanfaat.