Hibernate dynamic mapping and Dom4J enabled sessions
Posted by kalali on February 11, 2007 at 6:53 PM EST
Hibernate from version 3.0? provide a very useful feature for people who develop application frameworks. Indeed this feature allows you to work directly with XML documents and elements which represent entities.
Imagine that you have an application or an SDK which help users to manipulate data from different RDBMSs. Hibernate provide rich configuration facilities which help you configure Hibernate dynamically in term of adding mapping data or other configuration artifacts that usually stores in hibernate.cfg.xml or equal properties files.
As we are planning to use Hibernate dynamic mapping and Dom4J entity mode i am going to blog about it during my evaluation.
OK, Hibernate provide 3 kinds of entity mode

As you can see it is a basic ant based project.
Let me give you content of each file and explain about it as much as i could. First of all lets see what we have in hibernate.cfg.xml
We have one mapping file which is named student.hbm.xml so we include it into the configuration file. If you do not have MySQL around then use Derby which is included into NetBeans ;-) .
We used a file appender which send formatted log entry into a file named messages_dynamic.log in project root directory. next file which we are going to take a look is Student.hbm.xml it is our mapping file, where we define the student as a dynamic entity.
Next step is looking at our HibernateUtil which is known to the community for Hibernate booting and hibernate instance management.
here is its code:
Noting extra here. lets look at last part in which we try to use dom4j session to manipulate our data.
In the begging we create a session with dom4j entity mode. so it will return Dom4J elements as our entities. in next two blocks i have create two students one is Alice Cooper and the other is John connor (what does this name remind you? ;-) . we simply ask our session to save them as we do for usual POJO mode. Session know what to do with dom4j elements as it is configured as a DOM4J session.
In Second block we query our table and retrieve all entities into a list, but this list is not a list of Student POJOs instead it is a list of DOM4J elements. so we need to do some XML processing when we want to extract our entity properties. you can learn more about DOM4J at Here .
Next step we retrieve a single row, edit and save it into our database, Its all simple DOM4J operation which you should use over some elements to manipulate your data.
Build file that i used contains two target that we will use during this project. first one is hbm2ddl which will create our database structure and the second one is run target which will execute our main class. it is not required to include build file here you can download the sample and check it yourself. make sure you look at readme file before digging into execution of application.
In next few days I will try to do a simple benchmark for some simple CRUD operation to have a basic clue about DOM4J entity mode in our environment.
Imagine that you have an application or an SDK which help users to manipulate data from different RDBMSs. Hibernate provide rich configuration facilities which help you configure Hibernate dynamically in term of adding mapping data or other configuration artifacts that usually stores in hibernate.cfg.xml or equal properties files.
As we are planning to use Hibernate dynamic mapping and Dom4J entity mode i am going to blog about it during my evaluation.
OK, Hibernate provide 3 kinds of entity mode
- POJO
- DOM4J
- MAP
<property name="default_entity_mode">dom4j</property>To hibernate.cfg.xml . but for our sample we will create a session with dom4j entity mode. you can find a complete sample for this blog entry here . Make sure that you read readme file in project folder before you go toward executing it. For this sample I used Netbeans 6.0 M6 (which really rules) and Hibernate 3.2.1 . I wont tell steps to create project, XML file or ... but just actions and core required for hibernate side. you can see project structure in the following image.
As you can see it is a basic ant based project.
Let me give you content of each file and explain about it as much as i could. First of all lets see what we have in hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory > <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost/hiberDynamic</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--<property name="default_entity_mode">dom4j</property> --> <mapping resource="dynamic/Student.hbm.xml"/> </session-factory> </hibernate-configuration>The configuration file is a simple and traditional hibernate configuration file with pooling enabled and dialect sets to MySQL ones.
We have one mapping file which is named student.hbm.xml so we include it into the configuration file. If you do not have MySQL around then use Derby which is included into NetBeans ;-) .
Log4J configuration is another traditional one, as you see
log4j.appender.stdout=org.apache.log4j.FileAppender
log4j.appender.stdout.File=messages_dynamic.log
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=WARN, stdout
We used a file appender which send formatted log entry into a file named messages_dynamic.log in project root directory. next file which we are going to take a look is Student.hbm.xml it is our mapping file, where we define the student as a dynamic entity.
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class entity-name="Student" table="Student"> <id name="id" column="STUDENT_ID" type="long"> <generator class="native"/> </id> <property name="name" type= "string" column="STUDENT_NAME"/> <property name="lastName" type="string" column="STUDENT_LAST_NAME" /> </class> </hibernate-mapping>As you can see there is just one change in mapping file, we have entity-name attribute instead of class attribute. You should know that can have both class and entity-name attribute so an entity could be dynamic or mapped to a concrete class.
Next step is looking at our HibernateUtil which is known to the community for Hibernate booting and hibernate instance management.
here is its code:
package persistence;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}
Noting extra here. lets look at last part in which we try to use dom4j session to manipulate our data.
package dynamic;
import java.util.*;
import org.hibernate.EntityMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import persistence.HibernateUtil;
import org.dom4j.*;
public class DynamicMapping {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession().getSession(EntityMode.DOM4J);
Transaction tx = session.beginTransaction();
Query deleteQuery = session.createQuery("delete from Student");
deleteQuery.executeUpdate();
tx.commit();
tx = session.beginTransaction();
//create some some student and save them
{
Element anStudent = DocumentHelper.createElement("Student");
Element nameElement = DocumentHelper.createElement("name");
nameElement.setText("Alice");
Element lastNameElement = DocumentHelper.createElement("lastName");
lastNameElement.setText("Cooper");
anStudent.add(nameElement);
anStudent.add(lastNameElement);
session.save(anStudent);
}
{
Element anStudent = DocumentHelper.createElement("Student");
Element nameElement = DocumentHelper.createElement("name");
nameElement.setText("Lea");
Element lastNameElement = DocumentHelper.createElement("lastName");
lastNameElement.setText("Connor");
anStudent.add(nameElement);
anStudent.add(lastNameElement);
session.save(anStudent);
}
tx.commit();
//List all student
Query q = session.createQuery("from Student ");
List students = q.list();
org.dom4j.Element el = (org.dom4j.Element)students.get(0);
System.out.println(el.getText());
for (Iterator it = students.iterator(); it.hasNext();) {
org.dom4j.Element student = (org.dom4j.Element)it.next();
System.out.println("Printing an Student details: ");
for ( Iterator i = student.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
System.out.println( element.getName()+": "+ element.getText());
}
}
//retrieve an student, update and save it
q = session.createQuery("from Student where name =:studentName ");
q.setParameter("studentName", "Alice");
Element alice = (Element) q.uniqueResult();
alice.element("name").setText("No Alice any more");
tx=session.beginTransaction();
session.save(alice);
tx.commit();
session.close();
HibernateUtil.shutdown();
}
}
In the begging we create a session with dom4j entity mode. so it will return Dom4J elements as our entities. in next two blocks i have create two students one is Alice Cooper and the other is John connor (what does this name remind you? ;-) . we simply ask our session to save them as we do for usual POJO mode. Session know what to do with dom4j elements as it is configured as a DOM4J session.
In Second block we query our table and retrieve all entities into a list, but this list is not a list of Student POJOs instead it is a list of DOM4J elements. so we need to do some XML processing when we want to extract our entity properties. you can learn more about DOM4J at Here .
Next step we retrieve a single row, edit and save it into our database, Its all simple DOM4J operation which you should use over some elements to manipulate your data.
Build file that i used contains two target that we will use during this project. first one is hbm2ddl which will create our database structure and the second one is run target which will execute our main class. it is not required to include build file here you can download the sample and check it yourself. make sure you look at readme file before digging into execution of application.
In next few days I will try to do a simple benchmark for some simple CRUD operation to have a basic clue about DOM4J entity mode in our environment.
Related Topics >>
Blog Links >>
- Login or register to post comments
- Printer-friendly version
- kalali's blog
- 3597 reads






Comments
doubt related to " hibernate.default_entity_mode "
by divyasood - 2010-06-07 00:50
I have a doubt related to " hibernate.default_entity_mode ". For mapping purpose, I want to use pojo class as well as dynamic-map in one application. Can't I mix these two entity modes in hibernate? Presently my application has one database containing 5 or 6 tables. For all I have pojo classes containing getter and setters methods. Now I want to create new tables at runtime by asking the user for names of table as well as fields. Can I store those tables in the same database using old hibernate.cfg.xml file?