Main Tutorials

Hibernate component mapping example

Hibernate component represents as a group of values or properties, not entity (table). See following tutorial to understand how component works in Hibernate.

1. Customer Table

See below customer table.

customer table

Customer table, SQL script in MySQL database.


CREATE TABLE `customer` (
  `CUST_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `CUST_NAME` varchar(10) NOT NULL,
  `AGE` int(10) unsigned NOT NULL,
  `ADDRESS1` varchar(255) NOT NULL,
  `ADDRESS2` varchar(255) NOT NULL,
  `ADDRESS3` varchar(255) NOT NULL,
  `CREATED_DATE` date NOT NULL,
  `CREATED_BY` varchar(10) NOT NULL,
  PRIMARY KEY (`CUST_ID`) USING BTREE
);

2. Model Class

Now, create two model classes, Customer.java and Address.java, to represent the “customer” table above.

File : Customer.java


package com.mkyong.customer;

import java.util.Date;

public class Customer implements java.io.Serializable {

	private Integer custId;
	private String custName;
	private int age;
	private Address address;
	private Date createdDate;
	private String createdBy;

	//setters and getters
}

File : Address.java


package com.mkyong.customer;

public class Address implements java.io.Serializable {

	private String address1;
	private String address2;
	private String address3;
	
	//setters and getters
}

In this case, Address.java is a “component” represent the “Address1”, “Address2” and “Address3” columns for Customer.java

3. Component Mapping

Now, you can declares the component mapping like this :

File : Customer.hbm.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.mkyong.customer.Customer" table="customer"
		catalog="mkyongdb">

		<id name="custId" type="java.lang.Integer">
			<column name="CUST_ID" />
			<generator class="identity" />
		</id>
		<property name="custName" type="string">
			<column name="CUST_NAME" length="10" not-null="true" />
		</property>
		<property name="age" type="int">
			<column name="AGE" not-null="true" />
		</property>

		<component name="Address" class="com.mkyong.customer.Address">
			<property name="address1" type="string">
				<column name="ADDRESS1" not-null="true" />
			</property>
			<property name="address2" type="string">
				<column name="ADDRESS2" not-null="true" />
			</property>
			<property name="address3" type="string">
				<column name="ADDRESS3" not-null="true" />
			</property>
		</component>

		<property name="createdDate" type="date">
			<column name="CREATED_DATE" length="10" not-null="true" />
		</property>
		<property name="createdBy" type="string">
			<column name="CREATED_BY" length="10" not-null="true" />
		</property>
	</class>
</hibernate-mapping>

4. Run it

Create Address object, include it into the Customer object, and persist it.


package com.mkyong;

import java.util.Date;
import org.hibernate.Session;
import com.mkyong.customer.Address;
import com.mkyong.customer.Customer;
import com.mkyong.util.HibernateUtil;

public class App {
	public static void main(String[] args) {

	System.out.println("Hibernate component mapping");
	Session session = HibernateUtil.getSessionFactory().openSession();

	session.beginTransaction();

	Address address = new Address();
	address.setAddress1("Address 1");
	address.setAddress2("Address 2");
	address.setAddress3("Address 3");
		
        Customer cust = new Customer();
        cust.setCustName("mkyong");
        cust.setAge(30);
        cust.setAddress(address);
        cust.setCreatedDate(new Date());
        cust.setCreatedBy("system");
        
        session.save(cust);
       
	session.getTransaction().commit();
	System.out.println("Done");
	}
}

Output…


Hibernate component mapping
Hibernate: 
    insert 
    into
        mkyongdb.customer
        (CUST_NAME, AGE, ADDRESS1, ADDRESS2, ADDRESS3, CREATED_DATE, CREATED_BY) 
    values
        (?, ?, ?, ?, ?, ?, ?)
Done

Reference

  1. Hibernate component documentation

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
9 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
himanshu prasad
7 years ago

Hi ,
I have written a mapping class where I want use “id” field of component class as my id in the main class. Can we do that ?
Thanks

Asker
9 years ago

Do you have to close / disconnect the Session??

jimmy
11 years ago

how to do the mapping of component in JPA? eg in above example Address is not separate table in table then what is the table name we need to annote for Address Class.

Reem
11 years ago

thanks for this post
but i need sum help i have an error and i can’t remove it :

Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.hibernate.dialect.Dialect.(Dialect.java:58)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
… 1 more

Tushar
10 years ago
Reply to  mkyong

Hi MkYong 🙂

Thanks for the Cool 🙂 Example 🙂

Sir could you please tell me why am i getting Duplicate values for the following code

 

Criteria criteria = session.createCriteria(ComboTableDO.class);
criteria.add(Restrictions.like("tableField", "LOGICALOPR"));
criteria.add(Restrictions.like("active", "y"));
comboTableDOList = (List <ComboTableDO>) criteria.list();

for(ComboTableDO obj : comboTableDOList)
{
   System.out.println("obj="+obj.getText());
}// HERE I AM GETTING DUPLICATE VALUES 

i am confused could you please Guide me

MYSql Table ComboTable

|TABLEFLD | COMBOFLD | ACTIVE | TEXT |
| active  | Y        | Y      | Yes  |
| active  | Y        | Y      | NO   |

My Pojo Hibernate Class

@Entity
@Table(name = "CH_COMBOTBL")
public class ComboTableDO 
{
	@Id
	@Column(name = "TABLEFLD")
	private String tableField;
	
	@Column(name = "COMBOFLD")
	private String comboField;
	
	@Column(name = "ACTIVE")
	private String active;
	
	@Column(name = "TEXT")
	private String text;
Tushar
10 years ago
Reply to  Tushar

Hi MkYong 🙂

Thanks 🙂

i resolved it 🙂
it was my mistake i forgot to add
implements java.io.Serializable

Antony
11 years ago

Hi

Thanks for the post. Its really helpful. I have a question, why we go for component mapping instead we can declare the address properties in Customer class itself. Please clarify.

Bogdan
12 years ago

How about some tutorials about reading the information from a sql database using hibernate?