Hibernate Fetching Update (#607)

* BAEL-212
Contains:
1. Hibernate Criteria Query Classes
2. Hibernate Criteria Query Test

* Updating the config file and the HibernateUtil class

* Hibernate Criteria Queries Example

* Hibernate Fetching : Eager Loading vs Lazy Loading

* Hibernate Criteria Query files

* Hibernate Eager Loading and Lazy Loading Changes

* Latest Changes on Fetching

* Fetching Changes

* Latest Changes

* Latest Changes

* Undoing the changes
This commit is contained in:
PRITAM BANERJEE 2016-08-16 22:19:34 -07:00 committed by Grzegorz Piwowarek
parent fe16518c17
commit 6c062ca19e
6 changed files with 198 additions and 185 deletions

View File

@ -3,80 +3,71 @@ package com.baeldung.hibernate.fetching.model;
import java.io.Serializable; import java.io.Serializable;
import java.sql.Date; import java.sql.Date;
public class OrderDetail implements Serializable { public class OrderDetail implements Serializable{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private Long orderId; private Long orderId;
private Date orderDate; private Date orderDate;
private String orderDesc; private String orderDesc;
private User user; private User user;
public OrderDetail() { public OrderDetail(){
}
} public OrderDetail(Date orderDate, String orderDesc) {
super();
this.orderDate = orderDate;
this.orderDesc = orderDesc;
}
public OrderDetail(Date orderDate, String orderDesc) { public Date getOrderDate() {
super(); return orderDate;
this.orderDate = orderDate; }
this.orderDesc = orderDesc; public void setOrderDate(Date orderDate) {
} this.orderDate = orderDate;
}
public Date getOrderDate() { public String getOrderDesc() {
return orderDate; return orderDesc;
} }
public void setOrderDesc(String orderDesc) {
public void setOrderDate(Date orderDate) { this.orderDesc = orderDesc;
this.orderDate = orderDate; }
} public User getUser() {
return user;
public String getOrderDesc() { }
return orderDesc; public void setUser(User user) {
} this.user = user;
}
public void setOrderDesc(String orderDesc) { @Override
this.orderDesc = orderDesc; public int hashCode() {
} final int prime = 31;
int result = 1;
public User getUser() { result = prime * result + ((orderId == null) ? 0 : orderId.hashCode());
return user; return result;
} }
@Override
public void setUser(User user) { public boolean equals(Object obj) {
this.user = user; if (this == obj)
} return true;
if (obj == null)
@Override return false;
public int hashCode() { if (getClass() != obj.getClass())
final int prime = 31; return false;
int result = 1; OrderDetail other = (OrderDetail) obj;
result = prime * result + ((orderId == null) ? 0 : orderId.hashCode()); if (orderId == null) {
return result; if (other.orderId != null)
} return false;
} else if (!orderId.equals(other.orderId))
@Override return false;
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
OrderDetail other = (OrderDetail) obj;
if (orderId == null) {
if (other.orderId != null)
return false;
} else if (!orderId.equals(other.orderId))
return false;
return true;
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
return true;
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
} }

View File

@ -17,12 +17,11 @@ public class User implements Serializable {
} }
public User(final Long userId, final String userName, final String firstName, final String lastName) { public User(final Long userId, final String userName, final String firstName, final String lastName) {
super(); super();
this.userId = userId; this.userId = userId;
this.userName = userName; this.userName = userName;
this.firstName = firstName; this.firstName = firstName;
this.lastName = lastName; this.lastName = lastName;
} }
@Override @Override

View File

@ -1,24 +1,27 @@
package com.baeldung.hibernate.fetching.util; package com.baeldung.hibernate.fetching.util;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
public class HibernateUtil { public class HibernateUtil {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static Session getHibernateSession(String fetchMethod) { public static Session getHibernateSession(String fetchMethod) {
//two config files are there //two config files are there
//one with lazy loading enabled //one with lazy loading enabled
//another lazy = false //another lazy = false
SessionFactory sf = null;
if ("lazy".equals(fetchMethod)) {
sf = new Configuration().configure("fetchingLazy.cfg.xml").buildSessionFactory();
} else {
sf = new Configuration().configure("fetching.cfg.xml").buildSessionFactory();
}
final String configFileName = "lazy".equals(fetchMethod) ? // fetching.cfg.xml is used for this example
"fetchingLazy.cfg.xml" : final Session session = sf.openSession();
"fetching.cfg.xml"; return session;
}
return new Configuration()
.configure(configFileName)
.buildSessionFactory().openSession();
}
public static Session getHibernateSession() { public static Session getHibernateSession() {
return new Configuration() return new Configuration()

View File

@ -18,93 +18,94 @@ import com.baeldung.hibernate.fetching.model.User;
public class FetchingAppView { public class FetchingAppView {
public FetchingAppView() { public FetchingAppView(){
} }
public boolean lazyLoaded() { //lazily loaded
final Session sessionLazy = HibernateUtil.getHibernateSession("lazy"); public Set<OrderDetail> lazyLoaded(){
List<User> users = sessionLazy.createQuery("From User").list(); final Session sessionLazy = HibernateUtil.getHibernateSession("lazy");
User userLazyLoaded = users.get(3); List<User> users = sessionLazy.createQuery("From User").list();
//since data is lazyloaded so data won't be initialized User userLazyLoaded = new User();
Set<OrderDetail> orderDetailSet = userLazyLoaded.getOrderDetail(); userLazyLoaded = users.get(3);
//since data is lazyloaded so data won't be initialized
Set<OrderDetail> orderDetailSet = userLazyLoaded.getOrderDetail();
return (orderDetailSet);
}
return (Hibernate.isInitialized(orderDetailSet)); //eagerly loaded
} public Set<OrderDetail> eagerLoaded(){
final Session sessionEager = HibernateUtil.getHibernateSession();
public boolean eagerLoaded() { //data should be loaded in the following line
final Session sessionEager = HibernateUtil.getHibernateSession(); //also note the queries generated
//data should be loaded in the following line List<User> users =sessionEager.createQuery("From User").list();
//also note the queries generated User userEagerLoaded = new User();
List<User> users = sessionEager.createQuery("From User").list(); userEagerLoaded = users.get(3);
User userEagerLoaded = users.get(3); Set<OrderDetail> orderDetailSet = userEagerLoaded.getOrderDetail();
Set<OrderDetail> orderDetailSet = userEagerLoaded.getOrderDetail(); return orderDetailSet;
}
return (Hibernate.isInitialized(orderDetailSet));
}
//creates test data //creates test data
//call this method to create the data in the database //call this method to create the data in the database
public void createTestData() { public void createTestData() {
final Session session = HibernateUtil.getHibernateSession(); final Session session = HibernateUtil.getHibernateSession();
Transaction tx = session.beginTransaction(); Transaction tx = null;
tx = session.beginTransaction();
final User user1 = new User();
final User user2 = new User();
final User user3 = new User();
final User user1 = new User(); user1.setFirstName("Priyam");
final User user2 = new User(); user1.setLastName("Banerjee");
final User user3 = new User(); user1.setUserName("priyambanerjee");
session.save(user1);
user1.setFirstName("Priyam"); user2.setFirstName("Navneeta");
user1.setLastName("Banerjee"); user2.setLastName("Mukherjee");
user1.setUserName("priyambanerjee"); user2.setUserName("nmukh");
session.save(user1); session.save(user2);
user2.setFirstName("Navneeta"); user3.setFirstName("Molly");
user2.setLastName("Mukherjee"); user3.setLastName("Banerjee");
user2.setUserName("nmukh"); user3.setUserName("mollyb");
session.save(user2); session.save(user3);
user3.setFirstName("Molly"); final OrderDetail order1 = new OrderDetail();
user3.setLastName("Banerjee"); final OrderDetail order2 = new OrderDetail();
user3.setUserName("mollyb"); final OrderDetail order3 = new OrderDetail();
session.save(user3); final OrderDetail order4 = new OrderDetail();
final OrderDetail order5 = new OrderDetail();
final OrderDetail order1 = new OrderDetail(); order1.setOrderDesc("First Order");
final OrderDetail order2 = new OrderDetail(); order1.setOrderDate(new Date(2014, 10, 12));
final OrderDetail order3 = new OrderDetail(); order1.setUser(user1);
final OrderDetail order4 = new OrderDetail();
final OrderDetail order5 = new OrderDetail();
order1.setOrderDesc("First Order"); order2.setOrderDesc("Second Order");
order1.setOrderDate(new Date(2014, 10, 12)); order2.setOrderDate(new Date(2016, 10, 25));
order1.setUser(user1); order2.setUser(user1);
order2.setOrderDesc("Second Order"); order3.setOrderDesc("Third Order");
order2.setOrderDate(new Date(2016, 10, 25)); order3.setOrderDate(new Date(2015, 2, 17));
order2.setUser(user1); order3.setUser(user2);
order3.setOrderDesc("Third Order"); order4.setOrderDesc("Fourth Order");
order3.setOrderDate(new Date(2015, 2, 17)); order4.setOrderDate(new Date(2014, 10, 1));
order3.setUser(user2); order4.setUser(user2);
order4.setOrderDesc("Fourth Order"); order5.setOrderDesc("Fifth Order");
order4.setOrderDate(new Date(2014, 10, 1)); order5.setOrderDate(new Date(2014, 9, 11));
order4.setUser(user2); order5.setUser(user3);
order5.setOrderDesc("Fifth Order"); session.saveOrUpdate(order1);
order5.setOrderDate(new Date(2014, 9, 11)); session.saveOrUpdate(order2);
order5.setUser(user3); session.saveOrUpdate(order3);
session.saveOrUpdate(order4);
session.saveOrUpdate(order5);
tx.commit();
session.close();
session.saveOrUpdate(order1); }
session.saveOrUpdate(order2);
session.saveOrUpdate(order3);
session.saveOrUpdate(order4);
session.saveOrUpdate(order5);
// session.saveOrUpdate(user1);
tx.commit();
session.close();
}
} }

View File

@ -1,24 +1,43 @@
package com.baeldung.hibernate.fetching; package com.baeldung.hibernate.fetching;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.util.Set;
import org.hibernate.Hibernate;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import com.baeldung.hibernate.fetching.model.OrderDetail;
import com.baeldung.hibernate.fetching.view.FetchingAppView; import com.baeldung.hibernate.fetching.view.FetchingAppView;
public class HibernateFetchingTest { public class HibernateFetchingTest {
//this loads sample data in the database
@Before
public void addFecthingTestData(){
FetchingAppView fav = new FetchingAppView();
fav.createTestData();
}
//testLazyFetching() tests the lazy loading
//Since it lazily loaded so orderDetalSetLazy won't
//be initialized
@Test @Test
public void testLazyFetching() { public void testLazyFetching() {
FetchingAppView fav = new FetchingAppView(); FetchingAppView fav = new FetchingAppView();
fav.createTestData(); Set<OrderDetail> orderDetalSetLazy = fav.lazyLoaded();
assertFalse(fav.lazyLoaded()); assertFalse(Hibernate.isInitialized(orderDetalSetLazy));
} }
//testEagerFetching() tests the eager loading
//Since it eagerly loaded so orderDetalSetLazy would
//be initialized
@Test @Test
public void testEagerFetching() { public void testEagerFetching() {
FetchingAppView fav = new FetchingAppView(); FetchingAppView fav = new FetchingAppView();
assertTrue(fav.eagerLoaded()); Set<OrderDetail> orderDetalSetEager = fav.eagerLoaded();
assertTrue(Hibernate.isInitialized(orderDetalSetEager));
} }
} }