Agenda What is Hibernate Spring Integration Questions Overview Benefits Example Spring Integration Questions
What is Hibernate? Popular Open Source Object/Relational Mapping (ORM) tool Transparent persistence for POJOs (Plain Old Java Objects)
Object/Relational Mapping JavaObject int id; String name; String getName() int getId() void setName(String) void setId(int) SQL Table id [int] primary key, name [varchar(50)] Magic Happens Here (O/R Mapper – i.e. Hibernate)
Other ORM Solutions “Open” iBatis SQL Maps JDO JPA Commercial TopLink
Why Hibernate? Retains natural object model (transparent) Minimizes Code Does not require a container Model is not tied to persistance implementation
Hibernate's Goal Remove 95% of common data persistence problems
How do you use it? Act on your data model Query in SQL and/or HQL ... or using your object model
Auction Object Model
Persistant Class Default Constructor Getters/Setters public class AuctionItem { private Long _id; private Set _bids; private Bid _successfulBid private String _description; public Long getId() { return _id; } private void setId(Long id) { _id = id; public String getDescription() { return _description; public void setDescription(String desc) { _description=desc; … Default Constructor Getters/Setters Collections use interface types Identifier property
XML Mapping Readable metadata Column/Table map Key Generation <class name=“AuctionItem” table=“AUCTION_ITEM”> <id name=“id” column=“ITEM_ID”> <generator class=“native”/> </id> <property name=“description” column=“DESCR”/> <many-to-one name=“successfulBid” column=“SUCCESSFUL_BID_ID”/> <set name=“bids” cascade=“all” lazy=“true”> <key column=“ITEM_ID”/> <one-to-many class=“Bid”/> </set> </class> Readable metadata Column/Table map Key Generation Collections Fetching Strategies
Working with Data Retrieve an AuctionItem and change description Session session = sessionFactory.openSession(); Transaction tx = s.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); item.setDescription(newDescription); tx.commit(); session.close();
Working with Data Retrieve an AuctionItem and create a new persistent Bid Bid bid = new Bid(); bid.setAmount(bidAmount); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); bid.setItem(item); item.getBids().add(bid); tx.commit(); session.close();
Hibernate in code Retrieve an AuctionItem and create a new persistent Bid Bid bid = new Bid(); bid.setAmount(bidAmount); Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); bid.setItem(item); item.getBids().add(bid); tx.commit(); session.close();
Hibernate in code Retrieve an AuctionItem and create a new persistent Bid Session session = sf.openSession(); Transaction tx = session.beginTransaction(); AuctionItem item = (AuctionItem) session.get(ActionItem.class, itemId); tx.commit(); session.close(); item.setDescription(newDescription); Session session2 = sf.openSession(); Transaction tx = session2.beginTransaction(); session2.update(item); session2.close();
Benefits Metadata controlled persistence Transparent - working with the model, not the data access technology Pooling, Caching, Transactions can all be handled outside of our code
Integrating Spring and Hibernate
Spring and Hibernate Benefits Examples
Benefits Resource Management Extended Transaction Support IoC / AOP Session Management Extended Transaction Support JTA and/or JDBC Flexible Transaction Demarcation Programmatic Declarative (Spring's XML config) HibernateTemplate Simplifies Hibernate API
Spring IoC Session POJO DAO setSession() save()
Spring Interceptors (AOP) Business Logic Interceptor DAO getCatById() save(Cat) Session Spring Framework
Spring’s HibernateTemplate Hibernate Only: public User getUserByEmailAddress(final String email) { try { Session session = sessionFactory.openSession(); List list = session.find( "from User user where user.email=?", email, Hibernate.STRING); return (User) list.get(0); } finally { session.close(); } } HibernateTemplate: public User getUserByEmailAddress(final String email) { List list = getHibernateTemplate().find( "from User user where user.email=?", email, Hibernate.STRING); return (User) list.get(0); }