Home > Java > FetchType Lazy dan Eager Pada Hibernate

FetchType Lazy dan Eager Pada Hibernate

December 27, 2013 Leave a comment Go to comments

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.

  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: