Hibernate

Hibernate Search Tutorial – (Hibernate Search API)-Hibernate 4 on Baby Steps

<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div dir&equals;"ltr" style&equals;"text-align&colon; justify&semi;">&NewLine;<div class&equals;"separator" style&equals;"clear&colon; both&semi; text-align&colon; center&semi;"><img src&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;wp-content&sol;uploads&sol;2013&sol;07&sol;hibernate-search-banner-1180px&period;png" border&equals;"0" &sol;><&sol;div>&NewLine;<p>Welcome to Hibernate Search Tutorial&period; In this hibernate search tutorial we will discuss about Hibernate 4 &lpar;<b>Hibernate Search API<&sol;b>&rpar;&period; Actually Hibernate 4 provide some extra features related to searching than Hibernate 3&period; The following chapter will guide you through the initial steps required to integrate Hibernate Search into an existing Hibernate enabled application&period; In case you are new to Hibernate so we recommend you <b><a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;2012&sol;03&sol;hibernate-3-on-baby-steps&period;html" target&equals;"&lowbar;blank" rel&equals;"noopener">start here<&sol;a><&sol;b>&period;<&sol;p>&NewLine;<p><i><b>Hibernate 4 &equals; Hibernate 3 &plus; Hibernate Search API&lpar;or Lucene API&rpar;<&sol;b><&sol;i><&sol;p>&NewLine;<p>As see above in this tutorial we will discuss only about the Hibernate Search API&period; All hibernate functionality we already discuss in the <b><a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;2012&sol;03&sol;hibernate-3-on-baby-steps&period;html" target&equals;"&lowbar;blank" rel&equals;"noopener">Hibernate 3 on Baby Step tutorial<&sol;a><&sol;b>&period;<&sol;p>&NewLine;<p><b>System Requirement for <i>Hibernate Search API<&sol;i>&&num;8211&semi;<&sol;b><&sol;p>&NewLine;<&sol;div>&NewLine;<div id&equals;"ads-id" align&equals;"center"><&sol;div>&NewLine;<p><b>1&period; Java Runtime&colon;<&sol;b> A JDK or JRE version 6 or greater&period;<br &sol;>&NewLine;You can download a Java Runtime for Windows&sol;Linux&sol;Solaris <b><a href&equals;"http&colon;&sol;&sol;www&period;oracle&period;com&sol;technetwork&sol;java&sol;&percnt;20javase&sol;downloads&sol;index&period;html">download here<&sol;a><&sol;b>&period;<&sol;p>&NewLine;<p><b>2&period; Hibernate Search&colon; <i>hibernate-search-4&period;2&period;0&period;Final&period;jar<&sol;i><&sol;b> and all runtime dependencies&period; You can get the jar artifacts either from the dist&sol;lib directory of the <b><a href&equals;"http&colon;&sol;&sol;sourceforge&period;net&sol;projects&sol;hibernate&sol;files&sol;hibernate-search&sol;">Hibernate Search distribution<&sol;a><&sol;b>&period;<&sol;p>&NewLine;<p><b>3&period; Hibernate Core&colon;<&sol;b> These instructions have been tested against Hibernate 4&period;1&period; You will need <i><b>hibernate-core-4&period;1&period;9&period;Final&period;jar<&sol;b><&sol;i> and its <b>download here<&sol;b>&period;<&sol;p>&NewLine;<p><b>4&period; JPA 2&colon;<&sol;b> Even though Hibernate Search can be used without JPA annotations the following instructions will use them for basic entity configuration <i><b>&lpar;&commat;Entity&comma; &commat;Id&comma; &commat;OneToMany&comma;&&num;8230&semi;<&sol;b><&sol;i>&rpar;&period; This part of the configuration could also be expressed in xml or code&period; Hibernate Search&comma; however&comma; has also its own set of annotations &lpar;<i><b>&commat;Indexed&comma; &commat;DocumentId&comma; &commat;Field&comma;&&num;8230&semi;&rpar;<&sol;b><&sol;i> for which there exists so far no XML based alternative&period;<&sol;p>&NewLine;<p><b>Configuration for <i>Hibernate Search API<&sol;i>&colon; <&sol;b>Once you have downloaded and added all required libs to your application you have to add a couple of properties to your hibernate configuration file &lpar;<i><b>hibernate&period;cfg&period;xml or hibernate&period;properties<&sol;b><&sol;i>&rpar;<&sol;p>&NewLine;<&sol;div>&NewLine;<pre class&equals;"highlight">&period;&period;&period; &NewLine;&lt&semi;property name&equals;"hibernate&period;search&period;default&period;directory&lowbar;provider" &NewLine;value&equals;"filesystem"&sol;&gt&semi; &NewLine;&lt&semi;property name&equals;"hibernate&period;search&period;default&period;indexBase" &NewLine;value&equals;"D&colon;dojuploadindex&gt&semi; &NewLine;&period;&period;&period; &NewLine;<&sol;pre>&NewLine;<p>First you have to tell Hibernate Search which <i><b>DirectoryProvider <&sol;b><&sol;i>to use&period; This can be achieved by setting the <i><b>hibernate&period;search&period;default&period;directory&lowbar;provider<&sol;b><&sol;i> property&period; <b>Apache Lucene<&sol;b> has the notion of a Directory to store the index files&period; Hibernate Search handles the initialization and configuration of a Lucene Directory instance via a <i><b>DirectoryProvider<&sol;b><&sol;i>&period; In this tutorial we will use a a directory provider storing the index in the file system&period; This will give us the ability to physically inspect the Lucene indexes created by Hibernate Search&period;<&sol;p>&NewLine;<pre class&equals;"highlight">&lt&semi;&quest;xml version&equals;'1&period;0' encoding&equals;'UTF-8'&quest;&gt&semi; &NewLine;&lt&semi;&excl;DOCTYPE hibernate-configuration PUBLIC &NewLine; "-&sol;&sol;Hibernate&sol;Hibernate Configuration DTD 3&period;0&sol;&sol;EN" &NewLine; "http&colon;&sol;&sol;www&period;hibernate&period;org&sol;dtd&sol;hibernate-configuration-3&period;0&period;dtd"&gt&semi; &NewLine;&lt&semi;&excl;-- Generated by MyEclipse Hibernate Tools&period; --&gt&semi; &NewLine;&lt&semi;hibernate-configuration&gt&semi; &NewLine; &NewLine; &lt&semi;session-factory&gt&semi; &NewLine; &lt&semi;&excl;-- Database connection settings --&gt&semi; &NewLine; &lt&semi;property name&equals;"connection&period;driver&lowbar;class"&gt&semi;com&period;mysql&period;jdbc&period;Driver&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;property name&equals;"connection&period;url"&gt&semi;jdbc&colon;mysql&colon;&sol;&sol;localhost&colon;3306&sol;test&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;property name&equals;"connection&period;username"&gt&semi;root&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;property name&equals;"connection&period;password"&gt&semi;root&lt&semi;&sol;property&gt&semi; &NewLine; &NewLine; &lt&semi;&excl;-- JDBC connection pool &lpar;use the built-in&rpar; --&gt&semi; &NewLine; &lt&semi;property name&equals;"connection&period;pool&lowbar;size"&gt&semi;1&lt&semi;&sol;property&gt&semi; &NewLine; &NewLine; &lt&semi;&excl;-- SQL dialect --&gt&semi; &NewLine; &lt&semi;property name&equals;"dialect"&gt&semi;org&period;hibernate&period;dialect&period;MySQLDialect&lt&semi;&sol;property&gt&semi; &NewLine; &NewLine; &lt&semi;&excl;-- Echo all executed SQL to stdout --&gt&semi; &NewLine; &lt&semi;property name&equals;"show&lowbar;sql"&gt&semi;true&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;property name&equals;"hbm2ddl&period;auto"&gt&semi;update&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;property name&equals;"hibernate&period;search&period;default&period;directory&lowbar;provider"&gt&semi;filesystem&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;property name&equals;"hibernate&period;search&period;default&period;indexBase"&gt&semi;D&colon;dojuploadindex&lt&semi;&sol;property&gt&semi; &NewLine; &lt&semi;&excl;-- Mapping files --&gt&semi; &NewLine; &lt&semi;mapping class&equals;"com&period;dineshonjava&period;h4java&period;Book"&sol;&gt&semi; &NewLine; &NewLine; &lt&semi;&sol;session-factory&gt&semi; &NewLine; &NewLine;&lt&semi;&sol;hibernate-configuration&gt&semi; &NewLine;<&sol;pre>&NewLine;<p>Now next to the directory provider you also have to specify the default base directory for all indexes via <i><b>hibernate&period;search&period;default&period;indexBase<&sol;b><&sol;i>&period; Lets assume that your application contains the Hibernate managed classes <i><b>com&period;dineshonjava&period;h4java&period;Book<&sol;b><&sol;i> and you want to add free text search capabilities to your application in order to search the books contained in your database&period;<&sol;p>&NewLine;<p><b>Example entities Book before adding Hibernate Search specific annotations&colon;<&sol;b><&sol;p>&NewLine;<&sol;div>&NewLine;<pre class&equals;"highlight">package com&period;dineshonjava&period;h4java&semi; &NewLine;&period;&period;&period; &NewLine;&commat;Entity &NewLine;public class Book &lbrace; &NewLine;&commat;Id &NewLine;&commat;GeneratedValue &NewLine;private Integer id&semi; &NewLine; &NewLine;&commat;Column &NewLine;private String title&semi; &NewLine;&commat;Column &NewLine;private String subtitle&semi; &NewLine;&commat;Column &NewLine;private Date publicationDate&semi; &NewLine; &NewLine;public Book&lpar;&rpar; &lbrace;&rcub; &NewLine;public Integer getId&lpar;&rpar; &lbrace; &NewLine; return id&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setId&lpar;Integer id&rpar; &lbrace; &NewLine; this&period;id &equals; id&semi; &NewLine; &rcub; &NewLine; &NewLine; public String getTitle&lpar;&rpar; &lbrace; &NewLine; return title&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setTitle&lpar;String title&rpar; &lbrace; &NewLine; this&period;title &equals; title&semi; &NewLine; &rcub; &NewLine; &NewLine; public String getSubtitle&lpar;&rpar; &lbrace; &NewLine; return subtitle&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setSubtitle&lpar;String subtitle&rpar; &lbrace; &NewLine; this&period;subtitle &equals; subtitle&semi; &NewLine; &rcub; &NewLine; &NewLine; public Date getPublicationDate&lpar;&rpar; &lbrace; &NewLine; return publicationDate&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setPublicationDate&lpar;Date publicationDate&rpar; &lbrace; &NewLine; this&period;publicationDate &equals; publicationDate&semi; &NewLine; &rcub; &NewLine;&rcub; &NewLine;<&sol;pre>&NewLine;<p><i><b>&commat;Indexed-<&sol;b><&sol;i><br &sol;>&NewLine;To achieve this you have to add a few annotations to the <i><b>Book <&sol;b><&sol;i>class&period; The first annotation <i><b>&commat;Indexed<&sol;b><&sol;i> marks <b>Book as indexable<&sol;b>&period; By design Hibernate Search needs to store an untokenized id in the index to ensure index unicity for a given entity&period;<&sol;p>&NewLine;<p><i><b><i><b>&commat;DocumentId-<&sol;b><&sol;i> <&sol;b><&sol;i><br &sol;>&NewLine;<i><b>&commat;DocumentId <&sol;b><&sol;i>marks the property to use for this purpose and is in most cases the same as the database primary key&period; The <i><b>&commat;DocumentId<&sol;b><&sol;i> annotation is optional in the case where an <i><b>&commat;Id <&sol;b><&sol;i>annotation exists&period;<&sol;p>&NewLine;<p><i><b>&commat;Field-<&sol;b><&sol;i><br &sol;>&NewLine;<i><b> <&sol;b><&sol;i>Next you have to mark the fields you want to make searchable&period; Let&&num;8217&semi;s start with title and subtitle and annotate both with <i><b>&commat;Field<&sol;b><&sol;i>&period; The parameter <i><b>index&equals;Index&period;YES<&sol;b><&sol;i> will ensure that the text will be indexed&comma; while <i><b>analyze&equals;Analyze&period;YES<&sol;b><&sol;i> ensures that the text will be analyzed using the default Lucene analyzer&period; Usually&comma; analyzing means chunking a sentence into individual words and potentially excluding common words like &&num;8216&semi;a&&num;8217&semi; or &&num;8216&semi;the&&num;8217&semi;&period; The third parameter we specify within <i><b>&commat;Field<&sol;b><&sol;i>&comma; <i><b>store&equals;Store&period;NO<&sol;b><&sol;i>&comma; ensures that the actual<br &sol;>&NewLine;data will not be stored in the index&period; Whether this data is stored in the index or not has nothing to do with the ability to search for it&period; From Lucene&&num;8217&semi;s perspective it is not necessary to keep the data once the index is created&period;<&sol;p>&NewLine;<p><b>Note that<i> index&equals;Index&period;YES<&sol;i>&comma; <i>analyze&equals;Analyze&period;YES<&sol;i> and<i> store&equals;Store&period;NO<&sol;i> are the default values for these parameters and could be omitted&period;<&sol;b><&sol;p>&NewLine;<p><b>&commat;DateBridge- <&sol;b><br &sol;>&NewLine;Another annotation we have not yet discussed is <b>&commat;DateBridge<&sol;b>&period; This annotation is one of the built-in field bridges in Hibernate Search&period; The Lucene index is purely string based&period; For this reason Hibernate Search must convert the data types of the indexed fields to strings and vice versa&period; A range of predefined bridges are provided&comma; including the <i><b>DateBridge <&sol;b><&sol;i>which will convert a<b> java&period;util&period;Date into a String<&sol;b> with the specified resolution&period;<&sol;p>&NewLine;<p><b>Example Book entities after adding Hibernate Search annotations&colon;<&sol;b><&sol;p>&NewLine;<&sol;div>&NewLine;<pre class&equals;"highlight">package com&period;dineshonjava&period;h4java&semi; &NewLine; &NewLine;import java&period;util&period;Date&semi; &NewLine; &NewLine;import javax&period;persistence&period;Entity&semi; &NewLine;import javax&period;persistence&period;GeneratedValue&semi; &NewLine;import javax&period;persistence&period;Id&semi; &NewLine; &NewLine;import org&period;apache&period;solr&period;analysis&period;LowerCaseFilterFactory&semi; &NewLine;import org&period;apache&period;solr&period;analysis&period;SnowballPorterFilterFactory&semi; &NewLine;import org&period;apache&period;solr&period;analysis&period;StandardTokenizerFactory&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Analyze&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;AnalyzerDef&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;DateBridge&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Field&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Index&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Indexed&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Parameter&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Resolution&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;Store&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;TokenFilterDef&semi; &NewLine;import org&period;hibernate&period;search&period;annotations&period;TokenizerDef&semi; &NewLine; &NewLine; &NewLine;&commat;Entity &NewLine;&commat;Indexed &NewLine;public class Book &lbrace; &NewLine; &commat;Id &NewLine; &commat;GeneratedValue &NewLine; private Integer id&semi; &NewLine; &commat;Field&lpar;index &equals; Index&period;YES&comma; analyze &equals; Analyze&period;YES&comma; store &equals; Store&period;NO&rpar; &NewLine; private String title&semi; &NewLine; &commat;Field&lpar;index &equals; Index&period;YES&comma; analyze &equals; Analyze&period;YES&comma; store &equals; Store&period;NO&rpar; &NewLine; private String subtitle&semi; &NewLine; &commat;Field&lpar;index &equals; Index&period;YES&comma; analyze &equals; Analyze&period;NO&comma; store &equals; Store&period;YES&rpar; &NewLine; &commat;DateBridge&lpar;resolution &equals; Resolution&period;DAY&rpar; &NewLine; private Date publicationDate&semi; &NewLine; &NewLine; public Book&lpar;&rpar; &lbrace; &NewLine; &rcub; &NewLine; &NewLine; public Integer getId&lpar;&rpar; &lbrace; &NewLine; return id&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setId&lpar;Integer id&rpar; &lbrace; &NewLine; this&period;id &equals; id&semi; &NewLine; &rcub; &NewLine; &NewLine; public String getTitle&lpar;&rpar; &lbrace; &NewLine; return title&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setTitle&lpar;String title&rpar; &lbrace; &NewLine; this&period;title &equals; title&semi; &NewLine; &rcub; &NewLine; &NewLine; public String getSubtitle&lpar;&rpar; &lbrace; &NewLine; return subtitle&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setSubtitle&lpar;String subtitle&rpar; &lbrace; &NewLine; this&period;subtitle &equals; subtitle&semi; &NewLine; &rcub; &NewLine; &NewLine; public Date getPublicationDate&lpar;&rpar; &lbrace; &NewLine; return publicationDate&semi; &NewLine; &rcub; &NewLine; &NewLine; public void setPublicationDate&lpar;Date publicationDate&rpar; &lbrace; &NewLine; this&period;publicationDate &equals; publicationDate&semi; &NewLine; &rcub; &NewLine; &NewLine; &commat;Override &NewLine; public String toString&lpar;&rpar; &lbrace; &NewLine; return "Book &lbrack;id&equals;" &plus; id &plus; "&comma; title&equals;" &plus; title &plus; "&comma; subtitle&equals;" &plus; subtitle &NewLine; &plus; "&comma; publicationDate&equals;" &plus; publicationDate &plus; "&rsqb;"&semi; &NewLine; &rcub; &NewLine; &NewLine;&rcub; &NewLine;<&sol;pre>&NewLine;<p><b>Indexing-<&sol;b><br &sol;>&NewLine;Hibernate Search will transparently index every entity persisted&comma; updated or removed through Hibernate Core&period; However&comma; you have to create an initial Lucene index for the data already present in your database&period; Once you have added the above properties and annotations it is time to trigger an initial batch index of your books&period;<&sol;p>&NewLine;<pre class&equals;"highlight">FullTextSession fullTextSession &equals; Search&period;getFullTextSession&lpar;session&rpar;&semi; &NewLine;fullTextSession&period;createIndexer&lpar;&rpar;&period;startAndWait&lpar;&rpar;&semi; &NewLine;<&sol;pre>&NewLine;<p>After executing the above code&comma; you should be able to see a Lucene index under &&num;8220&semi;<i><b>D&colon;dojuploadindexcom&period;dineshonjava&period;h4java&period;Book&&num;8221&semi;<&sol;b><&sol;i><&sol;p>&NewLine;<p><b>Searching-<&sol;b><br &sol;>&NewLine;Now it is time to execute a first search&period; The general approach is to create a Lucene query and then wrap this query into a <i><b>org&period;hibernate&period;Query<&sol;b><&sol;i> in order to get all the functionality one is used to from the Hibernate API&period; The following code will prepare a query against the indexed fields&comma; execute it and return a list of Books&period;<&sol;p>&NewLine;<&sol;div>&NewLine;<pre class&equals;"highlight">package com&period;dineshonjava&period;h4java&semi; &NewLine; &NewLine;import java&period;util&period;Date&semi; &NewLine;import java&period;util&period;Iterator&semi; &NewLine;import java&period;util&period;List&semi; &NewLine; &NewLine;import org&period;hibernate&period;Transaction&semi; &NewLine;import org&period;hibernate&period;search&period;FullTextSession&semi; &NewLine;import org&period;hibernate&period;search&period;query&period;dsl&period;QueryBuilder&semi; &NewLine; &NewLine; &NewLine;public class App &lbrace; &NewLine;public static void main&lpar;String&lbrack;&rsqb; args&rpar; &lbrace; &NewLine; org&period;hibernate&period;Session session&equals;HibernateSessionFactory&period;getSession&lpar;&rpar;&semi; &NewLine; try&lbrace; &NewLine; Book book&equals;new Book&lpar;&rpar;&semi; &NewLine; book&period;setPublicationDate&lpar;new Date&lpar;&rpar;&rpar;&semi; &NewLine; book&period;setSubtitle&lpar;"jsp"&rpar;&semi; &NewLine; book&period;setTitle&lpar;"tech"&rpar;&semi; &NewLine; &sol;&sol;session&period;saveOrUpdate&lpar;book&rpar;&semi; &NewLine; FullTextSession fullTextSession &equals; org&period;hibernate&period;search&period;Search&period;getFullTextSession&lpar;session&rpar;&semi; &NewLine; Transaction tx &equals; fullTextSession&period;beginTransaction&lpar;&rpar;&semi; &NewLine; QueryBuilder qb &equals; fullTextSession&period;getSearchFactory&lpar;&rpar;&period;buildQueryBuilder&lpar;&rpar;&period;forEntity&lpar; Book&period;class &rpar;&period;get&lpar;&rpar;&semi; &NewLine; org&period;apache&period;lucene&period;search&period;Query query &equals; qb&period;keyword&lpar;&rpar;&period;onFields&lpar;"title"&comma; "subtitle"&rpar;&period;matching&lpar;"jsp"&rpar;&period;createQuery&lpar;&rpar;&semi; &NewLine; &sol;&sol; wrap Lucene query in a org&period;hibernate&period;Query &NewLine; org&period;hibernate&period;Query hibQuery &equals; fullTextSession&period;createFullTextQuery&lpar;query&comma; Book&period;class&rpar;&semi; &NewLine; &sol;&sol; execute search &NewLine; List result &equals; hibQuery&period;list&lpar;&rpar;&semi; &NewLine; Iterator&lt&semi;Book&gt&semi; it &equals; result&period;iterator&lpar;&rpar;&semi; &NewLine; while &lpar;it&period;hasNext&lpar;&rpar;&rpar; &lbrace; &NewLine; Book book1 &equals; &lpar;Book&rpar; it&period;next&lpar;&rpar;&semi; &NewLine; System&period;out&period;println&lpar;book1&rpar;&semi; &NewLine; &rcub; &NewLine; tx&period;commit&lpar;&rpar;&semi; &NewLine; &NewLine; &rcub; &NewLine; catch &lpar;Exception e&rpar; &lbrace; &NewLine; &sol;&sol; TODO&colon; handle exception &NewLine; &rcub;finally&lbrace; &NewLine; session&period;close&lpar;&rpar;&semi; &NewLine; &rcub; &NewLine; &NewLine; &rcub; &NewLine;&rcub; &NewLine;<&sol;pre>&NewLine;<&sol;div>&NewLine;<p><b>HibernateSessionFactory&period;java<&sol;b><&sol;p>&NewLine;<pre class&equals;"highlight">package com&period;dineshonjava&period;h4java&semi; &NewLine; &NewLine;import org&period;hibernate&period;HibernateException&semi; &NewLine;import org&period;hibernate&period;Session&semi; &NewLine;import org&period;hibernate&period;cfg&period;Configuration&semi; &NewLine; &NewLine;&sol;&ast;&ast; &NewLine; &ast; Configures and provides access to Hibernate sessions&comma; tied to the &NewLine; &ast; current thread of execution&period; Follows the Thread Local Session &NewLine; &ast; pattern&comma; see &lbrace;&commat;link http&colon;&sol;&sol;hibernate&period;org&sol;42&period;html &rcub;&period; &NewLine; &ast;&sol; &NewLine;public class HibernateSessionFactory &lbrace; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; Location of hibernate&period;cfg&period;xml file&period; &NewLine; &ast; Location should be on the classpath as Hibernate uses &NewLine; &ast; &num;resourceAsStream style lookup for its configuration file&period; &NewLine; &ast; The default classpath location of the hibernate config file is &NewLine; &ast; in the default package&period; Use &num;setConfigFile&lpar;&rpar; to update &NewLine; &ast; the location of the configuration file for the current session&period; &NewLine; &ast;&sol; &NewLine; private static String CONFIG&lowbar;FILE&lowbar;LOCATION &equals; "&sol;hibernate&period;cfg&period;xml"&semi; &NewLine; private static final ThreadLocal&lt&semi;Session&gt&semi; threadLocal &equals; new ThreadLocal&lt&semi;Session&gt&semi;&lpar;&rpar;&semi; &NewLine; private static Configuration configuration &equals; new Configuration&lpar;&rpar;&semi; &NewLine; private static org&period;hibernate&period;SessionFactory sessionFactory&semi; &NewLine; private static String configFile &equals; CONFIG&lowbar;FILE&lowbar;LOCATION&semi; &NewLine; &NewLine; static &lbrace; &NewLine; try &lbrace; &NewLine; configuration&period;configure&lpar;configFile&rpar;&semi; &NewLine; sessionFactory &equals; configuration&period;buildSessionFactory&lpar;&rpar;&semi; &NewLine; &rcub; catch &lpar;Exception e&rpar; &lbrace; &NewLine; System&period;err &NewLine; &period;println&lpar;"&percnt;&percnt;&percnt;&percnt; Error Creating SessionFactory &percnt;&percnt;&percnt;&percnt;"&rpar;&semi; &NewLine; e&period;printStackTrace&lpar;&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; &NewLine; private HibernateSessionFactory&lpar;&rpar; &lbrace; &NewLine; &rcub; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; Returns the ThreadLocal Session instance&period; Lazy initialize &NewLine; &ast; the &lt&semi;code&gt&semi;SessionFactory&lt&semi;&sol;code&gt&semi; if needed&period; &NewLine; &ast; &NewLine; &ast; &commat;return Session &NewLine; &ast; &commat;throws HibernateException &NewLine; &ast;&sol; &NewLine; public static Session getSession&lpar;&rpar; throws HibernateException &lbrace; &NewLine; Session session &equals; &lpar;Session&rpar; threadLocal&period;get&lpar;&rpar;&semi; &NewLine; &NewLine; if &lpar;session &equals;&equals; null &vert;&vert; &excl;session&period;isOpen&lpar;&rpar;&rpar; &lbrace; &NewLine; if &lpar;sessionFactory &equals;&equals; null&rpar; &lbrace; &NewLine; rebuildSessionFactory&lpar;&rpar;&semi; &NewLine; &rcub; &NewLine; session &equals; &lpar;sessionFactory &excl;&equals; null&rpar; &quest; sessionFactory&period;openSession&lpar;&rpar; &NewLine; &colon; null&semi; &NewLine; threadLocal&period;set&lpar;session&rpar;&semi; &NewLine; &rcub; &NewLine; &NewLine; return session&semi; &NewLine; &rcub; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; Rebuild hibernate session factory &NewLine; &ast; &NewLine; &ast;&sol; &NewLine; public static void rebuildSessionFactory&lpar;&rpar; &lbrace; &NewLine; try &lbrace; &NewLine; configuration&period;configure&lpar;configFile&rpar;&semi; &NewLine; sessionFactory &equals; configuration&period;buildSessionFactory&lpar;&rpar;&semi; &NewLine; &rcub; catch &lpar;Exception e&rpar; &lbrace; &NewLine; System&period;err &NewLine; &period;println&lpar;"&percnt;&percnt;&percnt;&percnt; Error Creating SessionFactory &percnt;&percnt;&percnt;&percnt;"&rpar;&semi; &NewLine; e&period;printStackTrace&lpar;&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; Close the single hibernate session instance&period; &NewLine; &ast; &NewLine; &ast; &commat;throws HibernateException &NewLine; &ast;&sol; &NewLine; public static void closeSession&lpar;&rpar; throws HibernateException &lbrace; &NewLine; Session session &equals; &lpar;Session&rpar; threadLocal&period;get&lpar;&rpar;&semi; &NewLine; threadLocal&period;set&lpar;null&rpar;&semi; &NewLine; &NewLine; if &lpar;session &excl;&equals; null&rpar; &lbrace; &NewLine; session&period;close&lpar;&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; return session factory &NewLine; &ast; &NewLine; &ast;&sol; &NewLine; public static org&period;hibernate&period;SessionFactory getSessionFactory&lpar;&rpar; &lbrace; &NewLine; return sessionFactory&semi; &NewLine; &rcub; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; return session factory &NewLine; &ast; &NewLine; &ast; session factory will be rebuilded in the next call &NewLine; &ast;&sol; &NewLine; public static void setConfigFile&lpar;String configFile&rpar; &lbrace; &NewLine; HibernateSessionFactory&period;configFile &equals; configFile&semi; &NewLine; sessionFactory &equals; null&semi; &NewLine; &rcub; &NewLine; &NewLine; &sol;&ast;&ast; &NewLine; &ast; return hibernate configuration &NewLine; &ast; &NewLine; &ast;&sol; &NewLine; public static Configuration getConfiguration&lpar;&rpar; &lbrace; &NewLine; return configuration&semi; &NewLine; &rcub; &NewLine; &NewLine;&rcub; &NewLine;<&sol;pre>&NewLine;<&sol;div>&NewLine;<p>After running the above class file <i><b>App&period;java<&sol;b><&sol;i> we get data on the database <b>test <&sol;b>and table name <b>book<&sol;b>&period;<&sol;p>&NewLine;<div class&equals;"separator" style&equals;"clear&colon; both&semi; text-align&colon; center&semi;"><img src&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;wp-content&sol;uploads&sol;2013&sol;07&sol;h4&period;png" border&equals;"0" &sol;><&sol;div>&NewLine;<p>And now checking the indexing file in the <i><b>&&num;8220&semi;D&colon;dojuploadindexcom&period;dineshonjava&period;h4java&period;Book&&num;8221&semi;&period;<&sol;b><&sol;i><&sol;p>&NewLine;<div class&equals;"separator" style&equals;"clear&colon; both&semi; text-align&colon; center&semi;"><img src&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;wp-content&sol;uploads&sol;2013&sol;07&sol;h41&period;png" border&equals;"0" &sol;><&sol;div>&NewLine;<p><b>Application Directory Structure and Jars files&period;<&sol;b><&sol;p>&NewLine;<div class&equals;"separator" style&equals;"clear&colon; both&semi; text-align&colon; center&semi;"><img src&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;wp-content&sol;uploads&sol;2013&sol;07&sol;h42&period;png" border&equals;"0" &sol;><&sol;div>&NewLine;<p><b>Output on Console&&num;8211&semi;<&sol;b><&sol;p>&NewLine;<div style&equals;"background-color&colon; &num;ff99cc&semi;">INFO&colon; HHH000037&colon; Columns&colon; &lbrack;id&comma; title&comma; subtitle&comma; publicationdate&rsqb;<br &sol;>&NewLine;Jul 10&comma; 2013 11&colon;51&colon;30 PM org&period;hibernate&period;tool&period;hbm2ddl&period;TableMetadata<br &sol;>&NewLine;INFO&colon; HHH000108&colon; Foreign keys&colon; &lbrack;&rsqb;<br &sol;>&NewLine;Jul 10&comma; 2013 11&colon;51&colon;30 PM org&period;hibernate&period;tool&period;hbm2ddl&period;TableMetadata<br &sol;>&NewLine;INFO&colon; HHH000126&colon; Indexes&colon; &lbrack;primary&rsqb;<br &sol;>&NewLine;Jul 10&comma; 2013 11&colon;51&colon;30 PM org&period;hibernate&period;tool&period;hbm2ddl&period;SchemaUpdate execute<br &sol;>&NewLine;INFO&colon; HHH000232&colon; Schema update complete<br &sol;>&NewLine;Hibernate&colon; select this&lowbar;&period;id as id0&lowbar;0&lowbar;&comma; this&lowbar;&period;publicationDate as publicat2&lowbar;0&lowbar;0&lowbar;&comma; this&lowbar;&period;subtitle as subtitle0&lowbar;0&lowbar;&comma; this&lowbar;&period;title as title0&lowbar;0&lowbar; from Book this&lowbar; where &lpar;this&lowbar;&period;id in &lpar;&quest;&rpar;&rpar;<br &sol;>&NewLine;Book &lbrack;id&equals;1&comma; title&equals;tech&comma; subtitle&equals;jsp&comma; publicationDate&equals;2013-07-10 21&colon;35&colon;33&period;0&rsqb;<&sol;div>&NewLine;<&sol;div>&NewLine;<p><i><b>Contents for Hibernate Search-<&sol;b><&sol;i><&sol;p>&NewLine;<ul style&equals;"text-align&colon; left&semi;">&NewLine;<li><b><a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;architecture-of-hibernate-search&sol;" target&equals;"&lowbar;blank" rel&equals;"noopener">Architecture of Hibernate Search <&sol;a><&sol;b><&sol;li>&NewLine;<li><b><a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;configuration-for-hibernate-search&sol;" target&equals;"&lowbar;blank" rel&equals;"noopener">Configuration for Hibernate Search <&sol;a> <&sol;b><&sol;li>&NewLine;<li><b><a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;mapping-entities-to-index-structure&sol;" target&equals;"&lowbar;blank" rel&equals;"noopener">Mapping entities to the index structure<&sol;a><&sol;b><&sol;li>&NewLine;<&sol;ul>&NewLine;<p><b>Download Source Code &plus; Libs<&sol;b><br &sol;>&NewLine;<b><a href&equals;"https&colon;&sol;&sol;sites&period;google&period;com&sol;a&sol;dineshonjava&period;com&sol;dineshonjava&sol;dineshonjava&sol;Hibernate4Demo&period;zip&quest;attredirects&equals;0&amp&semi;d&equals;1" target&equals;"&lowbar;blank" rel&equals;"nofollow noopener">Hibernate4Demo&period;zip<&sol;a><&sol;b><&sol;p>&NewLine;<p><b><&sol;b><br &sol;>&NewLine;<b><&sol;b><br &sol;>&NewLine;<b><&sol;b><br &sol;>&NewLine;<b><br &sol;>&NewLine;<&sol;b> <b>References<&sol;b><&sol;p>&NewLine;<ul class&equals;"unordered" style&equals;"-webkit-text-stroke-width&colon; 0px&semi; background-color&colon; white&semi; color&colon; &num;232323&semi; font-family&colon; Arial&comma; Helvetica&comma; sans-serif&semi; font-size&colon; 13px&semi; font-style&colon; normal&semi; font-variant&colon; normal&semi; font-weight&colon; normal&semi; letter-spacing&colon; normal&semi; line-height&colon; 20px&semi; list-style&colon; inside url&lpar;'http&colon;&sol;&sol;cdn&period;srccodes&period;com&sol;res&sol;images&sol;colors&sol;sky-blue&sol;bull&period;gif'&rpar;&semi; margin&colon; 0px&semi; orphans&colon; auto&semi; padding&colon; 0px 0px 20px&semi; text-align&colon; left&semi; text-indent&colon; 0px&semi; text-transform&colon; none&semi; white-space&colon; normal&semi; widows&colon; auto&semi; word-spacing&colon; 0px&semi;">&NewLine;<li style&equals;"border-bottom-color&colon; &num;d5d5d5&semi; border-bottom-style&colon; dashed&semi; border-bottom-width&colon; 1px&semi; color&colon; &num;232323&semi; margin&colon; 0px 0px 0px 20px&semi; padding&colon; 7px 0px&semi;"><a style&equals;"color&colon; &num;047fc8&semi; margin&colon; 0px&semi; padding&colon; 0px&semi; text-align&colon; left&semi; text-decoration&colon; none&semi;" href&equals;"http&colon;&sol;&sol;www&period;srccodes&period;com&sol;p&sol;article&sol;7&sol;Hibernate-Hello-World-example-using-Maven-build-tool-and-SQLite-database" target&equals;"&lowbar;blank" rel&equals;"noopener">Hibernate Hello World example using Maven build tool and SQLite database<&sol;a><&sol;li>&NewLine;<li style&equals;"border-bottom-color&colon; &num;d5d5d5&semi; border-bottom-style&colon; dashed&semi; border-bottom-width&colon; 1px&semi; color&colon; &num;232323&semi; margin&colon; 0px 0px 0px 20px&semi; padding&colon; 7px 0px&semi;"><a style&equals;"color&colon; &num;047fc8&semi; margin&colon; 0px&semi; padding&colon; 0px&semi; text-align&colon; left&semi; text-decoration&colon; none&semi;" href&equals;"http&colon;&sol;&sol;docs&period;jboss&period;org&sol;hibernate&sol;orm&sol;4&period;1&sol;devguide&sol;en-US&sol;html&sol;" target&equals;"&lowbar;blank" rel&equals;"noopener">Hibernate Developer Guide<&sol;a><&sol;li>&NewLine;<li style&equals;"border-bottom-color&colon; &num;d5d5d5&semi; border-bottom-style&colon; dashed&semi; border-bottom-width&colon; 1px&semi; color&colon; &num;232323&semi; margin&colon; 0px 0px 0px 20px&semi; padding&colon; 7px 0px&semi;"><a style&equals;"color&colon; &num;047fc8&semi; margin&colon; 0px&semi; padding&colon; 0px&semi; text-align&colon; left&semi; text-decoration&colon; none&semi;" href&equals;"http&colon;&sol;&sol;docs&period;jboss&period;org&sol;hibernate&sol;search&sol;4&period;1&sol;reference&sol;en-US&sol;html&lowbar;single&sol;" target&equals;"&lowbar;blank" rel&equals;"noopener">Hibernate Search<&sol;a><&sol;li>&NewLine;<&sol;ul>&NewLine;<p>&nbsp&semi;<&sol;p>&NewLine;<&sol;div>&NewLine;<div class&equals;"wp-post-navigation"> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab; <div class&equals;"wp-post-navigation-pre"> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab; <a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;how-to-solve-querysyntaxexception-table&sol;">Previous<&sol;a> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab; <&sol;div> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab; <div class&equals;"wp-post-navigation-next"> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab; <a href&equals;"https&colon;&sol;&sol;dineshonjava&period;com&sol;architecture-of-hibernate-search&sol;">Next<&sol;a> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab; <&sol;div> &NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;<&sol;div>&NewLine;<script type&equals;"text&sol;javascript">&NewLine;jQuery&lpar;document&rpar;&period;ready&lpar;function&lpar;&dollar;&rpar; &lbrace;&NewLine; &dollar;&period;post&lpar;'https&colon;&sol;&sol;dineshonjava&period;com&sol;wp-admin&sol;admin-ajax&period;php'&comma; &lbrace;action&colon; 'mts&lowbar;view&lowbar;count'&comma; id&colon; '398'&rcub;&rpar;&semi;&NewLine;&rcub;&rpar;&semi;&NewLine;<&sol;script>

Dinesh Rajput

Dinesh Rajput is the chief editor of a website Dineshonjava, a technical blog dedicated to the Spring and Java technologies. It has a series of articles related to Java technologies. Dinesh has been a Spring enthusiast since 2008 and is a Pivotal Certified Spring Professional, an author of a book Spring 5 Design Pattern, and a blogger. He has more than 10 years of experience with different aspects of Spring and Java design and development. His core expertise lies in the latest version of Spring Framework, Spring Boot, Spring Security, creating REST APIs, Microservice Architecture, Reactive Pattern, Spring AOP, Design Patterns, Struts, Hibernate, Web Services, Spring Batch, Cassandra, MongoDB, and Web Application Design and Architecture. He is currently working as a technology manager at a leading product and web development company. He worked as a developer and tech lead at the Bennett, Coleman & Co. Ltd and was the first developer in his previous company, Paytm. Dinesh is passionate about the latest Java technologies and loves to write technical blogs related to it. He is a very active member of the Java and Spring community on different forums. When it comes to the Spring Framework and Java, Dinesh tops the list!

Share
Published by
Dinesh Rajput

Recent Posts

Strategy Design Patterns using Lambda

Strategy Design Patterns We can easily create a strategy design pattern using lambda. To implement…

4 years ago

Decorator Pattern using Lambda

Decorator Pattern A decorator pattern allows a user to add new functionality to an existing…

4 years ago

Delegating pattern using lambda

Delegating pattern In software engineering, the delegation pattern is an object-oriented design pattern that allows…

4 years ago

Spring Vs Django- Know The Difference Between The Two

Technology has emerged a lot in the last decade, and now we have artificial intelligence;…

4 years ago

TOP 20 MongoDB INTERVIEW QUESTIONS 2022

Managing a database is becoming increasingly complex now due to the vast amount of data…

4 years ago

Scheduler @Scheduled Annotation Spring Boot

Overview In this article, we will explore Spring Scheduler how we could use it by…

4 years ago