We’re going to make a really easy test with Hibernate in our laptop. First, we’re going to configure an Apache Derby database. We are using Spring STS as our prefered IDE. Besides we will add Maven for our project’s dependencies .Configuring Hibernate in STS with Maven is an easy task. You only need to add your needings dependencies to our pom.xml file and start to coding.
With Maven you can always configure your repositories where you want to load your dependencies through your settings.xml file (it is saved within the conf directory of your Maven installation path.
To look for your requiered dependencies, STS or Eclipse have a special editor for the pom files from where you can find and add your requiered dependencies in your project. If we know that we are going to need a determined class o we want to know how many jar versions there are, I recommend going to the next two websites: mvnrepository and jarvana. The second one is really useful because you can look for a specified class, project or content. Our pom.xml file could have the following aspect:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hop2croft.pruebas.hibernate</groupId> <artifactId>pruebasHibernate</artifactId> <version>0.0.1-SNAPSHOT</version> <repositories> <repository> <id>jboss</id> <url>http://repository.jboss.org/maven2</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.5.1-Final</version> <type>pom</type> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.5.5-Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.5.5-Final</version> </dependency> <dependency> <groupId>antlr</groupId> <artifactId>antlr</artifactId> <version>2.7.6</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.9.0.GA</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.8</version> <type>pom</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>ejb3-persistence</artifactId> <version>3.3.2.Beta1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>10.7.1.1</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derbyclient</artifactId> <version>10.7.1.1</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derbynet</artifactId> <version>10.7.1.1</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derbytools</artifactId> <version>10.7.1.1</version> </dependency> <dependency> <groupId>javax.security</groupId> <artifactId>jacc</artifactId> <version>1.0</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build> </project>
One of the things I like most about using Maven is that you can either work with your favourite IDE or work from command line. This feature allows you to compile, package in a jar o run in an application server even if you don’t use a IDE.
We have create a new project STS and we have added the requiered dependencies to work with Hibernate. Now we are going to install Apache Derby in our computer. We download and install Derby from its website. We have to add several enviroment variables to our /etc/profiles file.
export DERBY_INSTALL=/Applications/Apache/db-derby-10.7.1.1 export DERBY_HOME=/Applications/Apache/db-derby-10.7.1.1 export CLASSPATH=$DERBY_INSTALL/lib/derby.jar:$DERBY_INSTALL/lib/derbytools.jar:$CLASSPATH
Apache gives us the posibility of installing an Eclipse plug-in to deal with Derby. In my case I’ve prefered working with Derby from command line. We can see the Derby info once we have installed it in our computer.
ew-host:bin hop2croft$ java org.apache.derby.tools.sysinfo ----------------- Informaci?n de Java ---------------- Versi?n de Java: 1.6.0_24 Proveedor de Java: Apple Inc. Inicio Java: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home Classpath de Java: /Applications/Apache/db-derby-10.7.1.1/lib/derby.jar:/Applications/Apache/db-derby-10.7.1.1/lib/derbytools.jar:.java Nombre del SO: Mac OS X Arquitectura del SO: x86_64 Versi?n del SO: 10.5.8 Nombre usuario Java: hop2croft Dir. inicial usuario:/Users/hop2croft Dir. usuario: /Applications/Apache/db-derby-10.7.1.1/bin java.specification.name: Java Platform API Specification java.specification.version: 1.6 java.runtime.version: 1.6.0_24-b07-334-9M3326 --------- Informaci?n de Derby -------- JRE - JDBC: Java SE 6 - JDBC 4.0 [/Applications/Apache/db-derby-10.7.1.1/lib/derby.jar] 10.7.1.1 - (1040133) [/Applications/Apache/db-derby-10.7.1.1/lib/derbytools.jar] 10.7.1.1 - (1040133) ------------------------------------------------------ -------------- Informaci?n de entorno local ---------- Entorno local actual: [espa?ol/Espa?a [es_ES]]
After that we have to run our server from command line as well:
$ java -jar derbyrun.jar server start Sat Apr 16 23:54:17 CEST 2011 : Se ha instalado el administrador de seguridad utilizando la directiva de seguridad de servidores b?sica. Sat Apr 16 23:54:19 CEST 2011 : Apache Derby Network Server - 10.7.1.1 - (1040133) se ha iniciado y está listo para aceptar conexiones en el puerto 1527
and the ij client:
$ ./ij Versi?n ij 10.7 ij>
From the client we can create a new database in the database server:
$ ./ij Versi?n ij 10.7 ij> connect 'jdbc:derby://localhost:1527/BDejemplo;create=true;user=hop2croft;password=hop2croft';
If you prefer not to use the command line client there are several options. You can either install an Eclipse plug-in or a sql graphic client as sql developer or squirrel. I recommend using the second one because it is fully compatible with Hibernate .
The first thing we are going to do is creating the hibernate.cfg.xml file. It indicates how our application is going to connect to our created database.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class"> org.apache.derby.jdbc.EmbeddedDriver </property> <property name="connection.url">jdbc:derby://localhost:1527/BDejemplo</property> <property name="connection.username">hop2croft</property> <property name="connection.password">hop2croft</property> <property name="dialect">org.hibernate.dialect.DerbyDialect</property> <property name="hibernate.generate_statistics">true</property> <property name="show_sql">true</property> <mapping resource="com/hibernate/entities/Coche.hbm.xml"/> </session-factory> </hibernate-configuration>
The show_sql propert allows us to see the sql queries that Hibernate use in our Derby database. The last entry in our hibernate config file indicates the resource we want to map. Now we map every single table from our database. In our case this file will be named as Coche.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.entities"> <class name="Coche" table="Coche"> <id name="modelo" type="string" column="modelo"></id> <property name="marca" type="string" column="marca"></property> <property name="precio" type="int" column="precio"></property> </class> </hibernate-mapping>
We can use annontations too:
@Entity @Table (name="coche") public class Coche { @Column (name="modelo") @Id private String modelo; @Column (name="marca") private String marca; @Column (name="precio") private int precio; // getters y setters ...
The next thing will be creating a DAO for quering the database. In our case we are going to implement a method to get all the cars we have in our database. Hibernate has an entity manager that deals with transactions.
public List<Coche> readFromManager(){ EntityManager manager = SessionManager.getEntityManager(); EntityTransaction tran = manager.getTransaction(); tran.begin(); Query query = manager.createQuery("select b from Coche b"); List<Coche> coches = query.getResultList(); tran.commit(); manager.close(); return coches; }
Our DAO (data access object) is ready to be used. All we have to do is create a service to use it. Our output could be like this:
Hibernate: select coche0_.modelo as modelo0_0_, coche0_.marca as marca2_0_0_, coche0_.precio as precio0_0_ from Coche coche0_ where coche().modelo=? Modelo: A6 Marca: Audi Precio: 8 ------------------------------------- Hibernate: select coche0_.modelo as modelo0_0_, coche0_.marca as marca2_0_0_, coche0_.precio as precio0_0_ from Coche coche0_ where coche().modelo=? 5887 [main] INFO org.hibernate.stat.Statistics - HQL: from Book, time: 15ms, rows: 2 Modelo: Carrera Marca: Porche Precio: 6 ------------------------------------- 5893 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - Logging statistics.... 5893 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - start time: 1302994741433 5893 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - sessions opened: 1 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - sessions closed: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - transactions: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - successful transactions: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - optimistic lock failures: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - flushes: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - connections obtained: 2 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - statements prepared: 2 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - statements closed: 2 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache puts: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache hits: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - second level cache misses: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities loaded: 2 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities updated: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities inserted: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities deleted: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - entities fetched (minimize this): 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections loaded: 0 5894 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections updated: 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections removed: 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections recreated: 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - collections fetched (minimize this): 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - queries executed to database: 1 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache puts: 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache hits: 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - query cache misses: 0 5895 [main] INFO org.hibernate.stat.ConcurrentStatisticsImpl - max query time: 15ms
In our Hibernate configuration file we have the option of showing data access, queries or sessiones created using statistics. It is really useful if we want to improve our application.
vpjaiganesh
14 octubre, 2011 at 2:22 pm
Hi,
I did the steps as you have outlined.
However when I try to use the «Reverse Engineering» tool of hibernate (from the hibernate tools),
The Table filter section fails to retrieve the database schema. It throws a error : Reading Schema error: Getting database metadata. Have you encountered this problem before?
Any suggestions?
hop2croft
14 octubre, 2011 at 5:06 pm
Hi vpjaiganesh,
first of all thanx you for visting my blog. .
I think that this question will be better in the Using Hibernate tools through Maven and Ant post, so I proceed to move it there. A comment cannot be moved in wordpress.com 😦Answering your question, is your MySQL or Derby DB instance already started?. Can you see your DB instance from a MySQL or Derby DB client?. Notice that you have to start your DB instance in order to generate your java class from it.
You have to double check also that your user, password and connection URL are correct. Look if your database schema is correcty written in your connection URL. Some examples in my case are:
jdbc:derby://localhost:1527/BDejemplo or
jdbc:mysql://127.0.0.1:3306/test
where you have to indicate which type of database you are using, your ip, port and schema.
One more thing that you can check is if your database driver is the specified one to your DB instance. In my case:
With apache derby:
org.apache.derby.jdbc.EmbeddedDriver
or with hibernate tools and MYSQL:
com.mysql.jdbc.Driver
Kind regards,
Iván.
Visit my new website java4developers.com
vpjaiganesh
16 octubre, 2011 at 6:19 pm
hi ,
Indeed the database is active and i am able to connect to it with Squirrel and create tables and insert rows using SQL. When I create the hibernate profile, it also connects. but only fails to fetch schema info in the rev eng tool of hibernate..
Thanks and Regards,
V.P.J.
hop2croft
16 octubre, 2011 at 6:29 pm
Hi,
I don’t know the reason why hibernate tools don’t allow you to your database. But try this, open in Eclipse the database view and try to connect from there to your db. Use the same driver you uses with hibernate tool. If you can connect I would know what to tell you 😦 , if not probably the driver you are using to connect from Squirrel isn’t the same that the one in Eclipse (hibernate tool or db view).
Look if you named your schema too. Maybe you haven’t named yet. You can see the whole URL connection in the DB properties in Squirrel.
Kind Regards,
hopcroft
vpjaiganesh
17 octubre, 2011 at 1:04 am
Hi,
Was able to solve the problem. The derbyrun.jar should be attached to the class path in the console configuration and the driver to use is ClientDriver from the same jar file. For some reason, it worked once i made these changes.
Thanks and Regards,
V.P.J.
თავისუფალი ბლოგი / Free Blog
29 octubre, 2013 at 5:24 pm
I got error in this line : EntityManager manager = SessionManager.getEntityManager(); . How can I get Entity Manager ?
hop2croft
31 octubre, 2013 at 3:42 pm
You need to create your entitymanager associated to a persistenceUnit.
Regards.