@NaturalId in Hibernate
February 01, 2013
@NaturalId is an Identifier in Hibernate Annotation. @NaturalId provides unique constraints to database schema. @NaturalId is used when we want to generate identifier any natural key, like Pan number, voter id etc. The natural keys are generally unique.
Find the example.
Car.java
package com.concretepage.persistence; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.NaturalId; @Entity @Table(name="car") public class Car implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private int id; @NaturalId private String vehicleRegNum; @Column(name="name") private String name; public Car(String vehicleRegNum,String name){ this.vehicleRegNum=vehicleRegNum; this.name=name; } public String getVehicleRegNum() { return vehicleRegNum; } public void setVehicleRegNum(String vehicleRegNum) { this.vehicleRegNum = vehicleRegNum; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
<!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="hibernate.connection.url"> jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <property name="hibernate.connection.pool_size">10</property> <property name="show_sql">true</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping class="com.concretepage.persistence.Car"/> </session-factory> </hibernate-configuration>
package com.concretepage.util; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.criterion.Restrictions; import com.concretepage.persistence.Car; public class HibernateUtil { private static final SessionFactory concreteSessionFactory; static { try { concreteSessionFactory = new AnnotationConfiguration() .configure().buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static Session getSession() throws HibernateException { return concreteSessionFactory.openSession(); } public static void main(String... args){ Session session=getSession(); session.beginTransaction(); Car c1= new Car("UP65 BN 2343 ","Maruti"); session.persist(c1); Car c2= new Car("DL60 AN 7845 ","Tata"); session.persist(c2); session.getTransaction().commit(); List<Car> list=session.createCriteria(Car.class).add(Restrictions.naturalId().set("vehicleRegNum","UP65 BN 2343")).list(); for(Car c:list){ System.out.println(c.getName()); } session.close(); } }
Hibernate: insert into car (name, vehicleRegNum) values (?, ?) Hibernate: insert into car (name, vehicleRegNum) values (?, ?) Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.vehicleRegNum as vehicleR3_0_0_ from car this_ where (this_.vehicleRegNum=?) Maruti