391 lines
9.3 KiB
Java
391 lines
9.3 KiB
Java
//$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<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();
|
|
}
|
|
|
|
static AuctionItem mainItem;
|
|
static User mainBidder;
|
|
static User mainSeller;
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
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();
|
|
|
|
}
|
|
}
|