FileDocCategorySizeDatePackage
Main.javaAPI DocHibernate 3.2.59622Sun Jul 03 22:18:34 BST 2005org.hibernate.auction

Main

public class Main extends Object
Demonstrate some useful features of Hibernate.
author
Gavin King

Fields Summary
private org.hibernate.SessionFactory
factory
static AuctionItem
mainItem
static User
mainBidder
static User
mainSeller
Constructors Summary
Methods Summary
public voidbidOnAuction(User bidder, AuctionItem item, float amount)
Demonstrates transitive persistence with detached object support

		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();
		}
	
public voidchangeItemDescription(java.lang.Long itemId, java.lang.String description)
Demonstrates automatic dirty checking

		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();
		}
	
public voidchangeUserDetails(User user)
Demonstrates detached object support

		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();
		}
	
public voidcreateTestAuctions()
Demonstrates transitive persistence

		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<i; j++ ) {

				Bid bid = new Bid();
				bid.setBidder(bidder1);
				bid.setAmount(j);
				bid.setDatetime( new Date() );
				bid.setItem(item);
				item.getBids().add(bid);
				bidder1.getBids().add(bid);

				Bid bid2 = new Bid();
				bid2.setBidder(bidder2);
				bid2.setAmount( j + 0.5f);
				bid2.setDatetime( new Date() );
				bid2.setItem(item);
				item.getBids().add(bid2);
				bidder2.getBids().add(bid2);
			}
			seller.getAuctions().add(item);
			mainItem = item;
		}
		mainBidder = bidder2;
		mainSeller = seller;

		BuyNow buyNow = new BuyNow();
		buyNow.setAmount(1.2f);
		buyNow.setDatetime( new Date() );
		buyNow.setBidder(mainBidder);
		buyNow.setItem(mainItem);
		mainBidder.getBids().add(buyNow);
		mainItem.getBids().add(buyNow);

		tx.commit();
		s.close();
	
public static voidmain(java.lang.String[] args)


		final Main test = new Main();

		Configuration cfg = new Configuration()
			.addClass(AuctionItem.class)
			.addClass(Bid.class)
			.addClass(User.class)
			.setProperty(Environment.HBM2DDL_AUTO, "create");
		//cfg.setProperty("hibernate.show_sql", "true");

		test.factory = cfg.buildSessionFactory();

		test.createTestAuctions();
		test.viewAllAuctionsSlow();

		test.viewAllAuctionsFast();
		test.bidOnAuction(mainBidder, mainItem, 5.5f);
		test.viewAllAuctionsFast();

		test.viewUserAuctions( mainSeller.getId() );
		mainSeller.setEmail("max@jboss.org");
		test.changeUserDetails(mainSeller);
		test.changeItemDescription(mainItem.getId(), "new description");
		test.viewUserAuctions( mainSeller.getId() );

		test.viewAuctionsByDescription("It", 0);
		test.viewAuctionsByDescription("DESC", 3);
		test.viewAuctionsByDescription("DESC", 8);

		test.factory.close();

	
public voidviewAllAuctionsFast()
Demonstrates HQL projection/aggregation

		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();
		}
	
public voidviewAllAuctionsSlow()
Demonstrates HQL with runtime fetch strategy

		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();
		}
	
public voidviewAuctionsByDescription(java.lang.String description, int condition)
Demonstrates query by example

		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();
		}
	
public voidviewUserAuctions(java.lang.Long sellerId)
Demonstrates query by criteria with runtime fetch strategy

		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();
		}