//$Id$ package org.hibernate.auction; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.hibernate.FetchMode; import org.hibernate.FlushMode; import org.hibernate.LockMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; import org.hibernate.criterion.Example; import org.hibernate.criterion.Expression; import org.hibernate.criterion.MatchMode; /** * Demonstrate some useful features of Hibernate. * * @author Gavin King */ public class Main { private SessionFactory factory; /** * Demonstrates HQL projection/aggregation */ public void viewAllAuctionsFast() throws Exception { System.out.println("Viewing all auction item info"); Session s = factory.openSession(); Transaction tx=null; try { tx = s.beginTransaction(); List auctions = s.createQuery( "select new AuctionInfo( item.id, item.description, item.ends, max(bid.amount) ) " + "from AuctionItem item " + "left join item.bids bid " + "group by item.id, item.description, item.ends " + "order by item.ends desc" ) .setMaxResults(100) .list(); Iterator iter = auctions.iterator(); while ( iter.hasNext() ) { AuctionInfo ai = (AuctionInfo) iter.next(); System.out.println( "Auction: " + ai.getId() + " - " + ai.getDescription() + ", ends: " + ai.getEnds() + ", highest bid: " + ai.getMaxAmount() ); } System.out.println(); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates HQL with runtime fetch strategy */ public void viewAllAuctionsSlow() throws Exception { System.out.println("Viewing all auction item objects"); Session s = factory.openSession(); Transaction tx=null; try { s.setFlushMode(FlushMode.NEVER); //entirely optional!! tx = s.beginTransaction(); List auctions = s.createQuery( "from AuctionItem item " + "left join fetch item.bids bid left join fetch bid.bidder " + "order by item.ends desc" ) .setMaxResults(100) .list(); Iterator iter = new HashSet(auctions).iterator(); while ( iter.hasNext() ) { AuctionItem auction = (AuctionItem) iter.next(); System.out.println( "Auction: " + auction.getId() + " - " + auction.getDescription() + ", ends: " + auction.getEnds() + ", bids: " + auction.getBids() ); } System.out.println(); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates transitive persistence with detached object support */ public void bidOnAuction(User bidder, AuctionItem item, float amount) throws Exception { System.out.println("Creating a new bid for auction item: " + item.getId() + " by user: " + bidder.getId() ); Session s = factory.openSession(); Transaction tx=null; try { tx = s.beginTransaction(); s.lock(item, LockMode.NONE); s.lock(bidder, LockMode.NONE); Bid bid = new Bid(); bid.setBidder(bidder); bid.setDatetime( new Date() ); bid.setAmount(amount); bid.setItem(item); bidder.getBids().add(bid); item.getBids().add(bid); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates detached object support */ public void changeUserDetails(User user) throws Exception { System.out.println("Changing user details for: " + user.getId() ); Session s = factory.openSession(); Transaction tx=null; try { tx = s.beginTransaction(); s.merge(user); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates automatic dirty checking */ public void changeItemDescription(Long itemId, String description) throws Exception { System.out.println("Changing auction item description for: " + itemId ); Session s = factory.openSession(); Transaction tx=null; try { tx = s.beginTransaction(); AuctionItem item = (AuctionItem) s.get(AuctionItem.class, itemId); if (item==null) throw new IllegalArgumentException("No item for the given id: " + itemId); item.setDescription(description); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates query by criteria with runtime fetch strategy */ public void viewUserAuctions(Long sellerId) throws Exception { System.out.println("Viewing user and auctions: " + sellerId); Session s = factory.openSession(); Transaction tx=null; try { tx = s.beginTransaction(); List list = s.createCriteria(User.class) .add( Expression.eq("id", sellerId) ) .setFetchMode("auctions", FetchMode.JOIN) .list(); if (list.size()==0) throw new IllegalArgumentException("No user for the given id: " + sellerId); User user = (User) list.get(0); System.out.println( "User: " + user.getId() + " - " + user.getName() + ", email: " + user.getEmail() + ", auctions: " + user.getAuctions() ); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates query by example */ public void viewAuctionsByDescription(String description, int condition) throws Exception { String msg = "Viewing auctions containing: " + description; if (condition>0) msg += " with condition: " + condition + "/10"; AuctionItem item = new AuctionItem(); item.setDescription(description); item.setCondition(condition); Session s = factory.openSession(); Transaction tx=null; try { tx = s.beginTransaction(); Iterator iter = s.createCriteria(AuctionItem.class) .add( Example.create(item) .enableLike(MatchMode.ANYWHERE) .ignoreCase() .excludeZeroes() ) .list() .iterator(); System.out.println(msg); while ( iter.hasNext() ) { item = (AuctionItem) iter.next(); System.out.println("Item: " + item.getId() + " - " + item.getDescription() ); } System.out.println(); tx.commit(); } catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { s.close(); } } /** * Demonstrates transitive persistence */ public void createTestAuctions() throws Exception { System.out.println("Setting up some test data"); Session s = factory.openSession(); Transaction tx = s.beginTransaction(); User seller = new User(); seller.setUserName("xam"); seller.setName( new Name("Max", new Character('R'), "Andersen") ); seller.setEmail("max@hibernate.org"); seller.setPassword("******"); seller.setAuctions( new ArrayList() ); s.save(seller); User bidder1 = new User(); bidder1.setUserName("1E1"); bidder1.setName( new Name( "Gavin", new Character('A'), "King") ); bidder1.setEmail("gavin@hibernate.org"); bidder1.setPassword("******"); bidder1.setBids( new ArrayList() ); s.save(bidder1); User bidder2 = new User(); bidder2.setUserName("steve"); bidder2.setName( new Name("Steve", null, "Ebersole") ); bidder2.setEmail("steve@hibernate.org"); bidder2.setPassword("******"); bidder2.setBids( new ArrayList() ); s.save(bidder2); for ( int i=0; i<3; i++ ) { AuctionItem item = new AuctionItem(); item.setShortDescription("Auction " + i); item.setDescription("the auction item number " + i); item.setEnds( new Date() ); item.setBids( new ArrayList() ); item.setSeller(seller); item.setCondition(i*3 + 2); for ( int j=0; j