Home > Java > Hibernate Fetching Strategy

Hibernate Fetching Strategy

December 29, 2013 Leave a comment Go to comments

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.

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: