[          Hibernate in 60 Minutes           ]                        Eric M. Burke                      www.ericburke.com...
[               My JDBC Experience                               ]        Frustration drove me to investigate         Hib...
[          Typical JDBC Problems                                      ]        Massive duplication            Relationsh...
[                Hibernate Questions                          ]        How hard is it to learn and use?        How invas...
[                  What is Hibernate?                               ]          Java Object/Relational Mapping            ...
[          What is Hibernate? (Contd)                    ]          Has a huge feature list             ○   Go to their w...
[                 Avoiding SQL                                  ]          Hibernate Query Language approach      public ...
[          Sample Application Code                            ]     Session session = getSessionFactory().openSession();  ...
[     Sample Code with Transaction                            ]      Session sess = ...      Transaction tx = sess.beginTr...
[               Development Options                  ]          Start with the database             ○   Use middlegen to ...
[                  Hibernate Tutorial                         ]        Design the database        Code some persistent c...
[                        Database Design                                       ]          Design your database first     ...
[                     Persistent Objects                  ]          POJOs - Plain Old Java Objects             ○   No ba...
[                     My Base Class                                     ]           public class PersistentClass implement...
[                      Category Class                                   ]         public class Category extends NameDescri...
[                   Category (Contd)                                 ]                 public Category getParentCategory()...
[                 Mapping Files                                                         Or Java 5                         ...
[           Mapping Files (Contd)                           ]          <set name="resources" table="CategoriesResources"  ...
[             Xdoclet Tag Example                               ]      /**       * @hibernate.class table="Categories"    ...
[             hibernate.cfg.xml                                       ]                                                 Ge...
[                      Ant Buildfile                                    ]          Invokes XDoclet             ○   XDocle...
[                       HibernateUtil                           ]          Trivial examples show this class             ○...
[                                DAOs                     ]        Insulate your code from Hibernate specifics        CR...
[                     Servlet Filter                                  ]    public class HibernateFilter implements Filter ...
[                    Business Objects                             ]          A layer between your application code and   ...
[            Architecture Summary                                       ]      AOP for    Transactions                   B...
[                            Gotchas                      ]          Must always have an open session             ○   See...
[          When Not to Use Hibernate                  ]          A horrible database design is forced on you             ...
[      10 Reasons to Love Hibernate                ]       1.Dynamic UPDATE          6.No more DTOs         generation – f...
Upcoming SlideShare
Loading in …5
×

hibernate

856 views
782 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
856
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
83
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

hibernate

  1. 1. [ Hibernate in 60 Minutes ] Eric M. Burke www.ericburke.comApril 14, 2005 Hibernate in 60 Minutes 1
  2. 2. [ My JDBC Experience ]  Frustration drove me to investigate Hibernate  Custom JDBC frameworks and idioms ○ Usually a class called JdbcUtil with static methods  Custom code generators ○ Database metadata is too cool to resist  Custom strategy for optimistic locking  Database-specific ID generationApril 14, 2005 Hibernate in 60 Minutes 2
  3. 3. [ Typical JDBC Problems ]  Massive duplication  Relationships are  Tied to specific really hard database ○ N+1 selects problem ○ parent/child updates  Error-prone  delete all then add try/catch/finally  Screen-specific DAOs for optimizationApril 14, 2005 Hibernate in 60 Minutes 3
  4. 4. [ Hibernate Questions ]  How hard is it to learn and use?  How invasive is it to my code?  What are the configuration headaches? ○ Yet another framework with XML files, JAR files, additional build complexity?  Does it simplify my life?April 14, 2005 Hibernate in 60 Minutes 4
  5. 5. [ What is Hibernate? ]  Java Object/Relational Mapping ○ Open source – LGPL ○ http://www.hibernate.org/ (JBoss Group)  Lets you avoid SQL  Works with (almost) all relational DBs ○ DB2, FrontBase, HSQLDB, Informix, Ingres, Interbase, Mckoi, MySQL, Oracle, Pointbase, PostgreSQL, Progress, SAP DB, SQL Server, Sybase, etc... ○ Or you can extend one of the Dialect classesApril 14, 2005 Hibernate in 60 Minutes 5
  6. 6. [ What is Hibernate? (Contd) ]  Has a huge feature list ○ Go to their web site – we dont have time  Maps JavaBeans (POJOs) to tables ○ XML defines the mappings ○ Very few bean requirements  SQL is generated at app startup time ○ As opposed to bytecode manipulation ○ New database? No problem! Change a few propsApril 14, 2005 Hibernate in 60 Minutes 6
  7. 7. [ Avoiding SQL ]  Hibernate Query Language approach public User getByScreenName(String screenName) { try { return (User) getSession().createQuery( "from User u where u.screenName=:screenName") .setString("screenName", screenName) .uniqueResult(); } catch (HibernateException e) { throw new DaoException(e); JavaBeans } Property Name }  Code-based query API public User getByScreenName(String screenName) { return getUnique(Expression.eq("screenName", screenName)); }April 14, 2005 Hibernate in 60 Minutes 7
  8. 8. [ Sample Application Code ] Session session = getSessionFactory().openSession(); // assume we know the root category id is 1 Category rootCategory = (Category) session.load( Category.class, new Long(1)); // we can immediately traverse the collection of messages // without any additional Hibernate code for (Object msgObj : rootCategory.getMessages()) { Message msg = (Message) msgObj; // generics+XDoclet==bad System.out.println(“Subject: “ + msg.getSubject()); System.out.println(“Body: “ + msg.getBody()); System.out.println(); } session.close();April 14, 2005 Hibernate in 60 Minutes 8
  9. 9. [ Sample Code with Transaction ] Session sess = ... Transaction tx = sess.beginTransaction(); // find the root category using Criteria Criteria criteria = sess.createCriteria(Category.class); criteria.add(Expression.isNull("parentCategory")); Category rootCategory = (Category) criteria.uniqueResult(); // change something rootCategory.setDescription(“The Root Category”); tx.commit(); sess.close();April 14, 2005 Hibernate in 60 Minutes 9
  10. 10. [ Development Options ]  Start with the database ○ Use middlegen to generate mapping files ○ Use hbm2java to generate JavaBeans  Start with JavaBeans C ○ Use XDoclet to generate mapping files ○ Use hbm2ddl to generate the database  Start with the XML mapping files ○ Hand-code the mapping files ○ Use both hbm2java and hbm2ddlApril 14, 2005 Hibernate in 60 Minutes 10
  11. 11. [ Hibernate Tutorial ]  Design the database  Code some persistent classes  Write an Ant buildfile ○ Generate the mapping files and hibernate.cfg.xml  Choose a strategy for sessions and transactions (Spring framework)  Write and test the DAOs  Add business logic and helper methodsApril 14, 2005 Hibernate in 60 Minutes 11
  12. 12. [ Database Design ]  Design your database first Categories Surrogate Keys Resources Work Best PK id PK id name name url description many-to-one description FK1 parentCategoryId createdOn CategoriesResources PK,FK1 categoryId PK,FK2 resourceId many-to-manyApril 14, 2005 Hibernate in 60 Minutes 12
  13. 13. [ Persistent Objects ]  POJOs - Plain Old Java Objects ○ No base class or interface requirement  Must have public no-arg constructor  Should have getter/setters ○ Or Hibernate can access fields directly ○ Hibernate uses JavaBeans property names  For mappings as well as in queries  Serializable is recommended  XDoclet tags are useful but not requiredApril 14, 2005 Hibernate in 60 Minutes 13
  14. 14. [ My Base Class ] public class PersistentClass implements Serializable { private static final long serialVersionUID = 1; private Long id; /** * @hibernate.id * column="id" * unsaved-value="null" * generator-class="native" * access="field" */ public Long getId() { Hibernate assigns the id return id; } private void setId(Long id) { this.id = id; } }April 14, 2005 Hibernate in 60 Minutes 14
  15. 15. [ Category Class ] public class Category extends NameDescription { private static final long serialVersionUID = 1; My base private Set childCategories = new HashSet(); private Set resources = new HashSet(); class, not private Category parentCategory; Hibernates public Category() { } public Category(String name, String description) { super(name, description); } public Set getChildCategories() { return childCategories; } public void setChildCategories(Set childCategories) { this.childCategories = childCategories; }April 14, 2005 Hibernate in 60 Minutes 15
  16. 16. [ Category (Contd) ] public Category getParentCategory() { return parentCategory; } public void setParentCategory(Category parentCategory) { this.parentCategory = parentCategory; } public Set getResources() { return resources; } public void setResources(Set resources) { this.resources = resources; } }April 14, 2005 Hibernate in 60 Minutes 16
  17. 17. [ Mapping Files Or Java 5 Annotations ]  Generated by XDoclet, 1 per persistent bean <hibernate-mapping> <class name="com.ericburke.linkblog.model.Category" table="Categories"> <id name="id" column="id" type="java.lang.Long" unsaved-value="null"> <generator class="native"/> </id> <set name="childCategories" lazy="true" inverse="true" cascade="save-update"> <key column="parentCategoryId"/> <one-to-many class="com.ericburke.linkblog.model.Category"/> </set> <many-to-one name="parentCategory" class="com.ericburke.linkblog.model.Category" cascade="none" column="parentCategoryId" not-null="false"/>April 14, 2005 Hibernate in 60 Minutes 17
  18. 18. [ Mapping Files (Contd) ] <set name="resources" table="CategoriesResources" lazy="true" cascade="save-update"> <key column="categoryId"/> <many-to-many column=”resourceId” class="com.ericburke.linkblog.model.Resource"/> </set> <property name="name" type="java.lang.String" column="name" length="255"/> <property name="description" type="java.lang.String" column="description" length="2000"/> </class> </hibernate-mapping>April 14, 2005 Hibernate in 60 Minutes 18
  19. 19. [ Xdoclet Tag Example ] /** * @hibernate.class table="Categories" */ public class Category extends NameDescription { /** * @hibernate.set cascade="save-update" inverse="true" * lazy="true" * @hibernate.collection-key column="parentCategoryId" * @hibernate.collection-one-to-many * class="com.ericburke.linkblog.model.Category" */ public Set getChildCategories() { return childCategories; } // no tags on the setters public void setChildCategories(Set childCategories) { }April 14, 2005 Hibernate in 60 Minutes 19
  20. 20. [ hibernate.cfg.xml ] Generated by XDoclet, or <hibernate-configuration> use Springs XML file <session-factory> <property name="dialect"> net.sf.hibernate.dialect.HSQLDialect</property> <property name="show_sql">true</property> <property name="use_outer_join">false</property> <property name="connection.username">sa</property> <property name="connection.driver_class"> org.hsqldb.jdbcDriver</property> <property name="connection.url"> jdbc:hsqldb:hsql://localhost/linkblog</property> <property name="connection.pool_size">5</property> <mapping resource="com/ericburke/linkblog/model/Category.hbm.xml"/> <mapping resource="com/ericburke/linkblog/model/Resource.hbm.xml"/> </session-factory> </hibernate-configuration>April 14, 2005 Hibernate in 60 Minutes 20
  21. 21. [ Ant Buildfile ]  Invokes XDoclet ○ XDoclet ships with the Hibernate tasks ○ Generates mapping files and hibernate.cfg.xml  Hibernate includes tasks for ○ hbm2java – generates the persistent classes ○ hbm2ddl – generates the database Requires the persistent .class files in the taskdefs classpath  Classpath needs ○ Hibernate Jars, Hibernate extensions, XDoclet, JDBC driver JAR fileApril 14, 2005 Hibernate in 60 Minutes 21
  22. 22. [ HibernateUtil ]  Trivial examples show this class ○ Creates a SessionFactory in the static initializer Configuration cfg = new Configuration(); SessionFactory sessionFactory = cfg.configure("/hibernate.cfg.xml") .buildSessionFactory();  Provides access to a Session ThreadLocal public static Session getSession() { Session s = (Session) threadSession.get(); if (s == null) { s = sessionFactory.openSession(); threadSession.set(s); } return s;  APIs to begin/commit/rollback transactionsApril 14, 2005 Hibernate in 60 Minutes 22
  23. 23. [ DAOs ]  Insulate your code from Hibernate specifics  CRUD operations ○ I use Java 5 generics heavily ○ You can also use Spring for DAO support  Locating persistent objects ○ Use Hibernate queries for efficiency ○ From there, walk the graph using normal Java collections semantics  Detached objects can be challengingApril 14, 2005 Hibernate in 60 Minutes 23
  24. 24. [ Servlet Filter ] public class HibernateFilter implements Filter { public void init(FilterConfig fc) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { try { filterChain.doFilter(req, res); HibernateUtil.commitTransaction(); } finally { Hibernate in Action, HibernateUtil.closeSession(); page 304 } } }April 14, 2005 Hibernate in 60 Minutes 24
  25. 25. [ Business Objects ]  A layer between your application code and the DAOs ○ Only allow business objects to hit the DAOs ○ Business objects and app code use persistent objects  Provide a consistent place to use AOP ○ try/catch/finally for transactions  Risk duplicating DAO code ○ Sometimes business object methods just delegateApril 14, 2005 Hibernate in 60 Minutes 25
  26. 26. [ Architecture Summary ] AOP for Transactions Business DAOs Hibernate Database Objects Application Code Persistent XML Objects Mappings Keep an Open SessionApril 14, 2005 Hibernate in 60 Minutes 26
  27. 27. [ Gotchas ]  Must always have an open session ○ Seemingly innocent code like fetching a lazy collection bombs ○ Swing – open a session on event thread ○ Servlets – use a filter or Spring  Hibernate tasks do not abort Ant ○ No failonerror attribute ○ Watch the build output carefully  Test associations and collections heavilyApril 14, 2005 Hibernate in 60 Minutes 27
  28. 28. [ When Not to Use Hibernate ]  A horrible database design is forced on you ○ Many composite keys  If your application is mostly mass operations ○ See pg. 181 “Hibernate in Action” ○ You might exhaust available heap space  ??April 14, 2005 Hibernate in 60 Minutes 28
  29. 29. [ 10 Reasons to Love Hibernate ] 1.Dynamic UPDATE 6.No more DTOs generation – figure out 7.Query result paging which columns changed 8.Automatic dirty checking 2.Trying new databases 9.Good price 3.Traversing associations 10.Good documentation 4.Optimistic Locking 5.ID generationApril 14, 2005 Hibernate in 60 Minutes 29

×