CRUD Operations in Hibernate 4.3

CRUD operations are Create(save), Read(select), Update(update) and Delete(delete).

Examples discussed here need to be tried out on top of the lab done @  http://javajee.com/lab-your-first-hibernate-43-program.

 

Session

Select, Save, update and delete operations in hibernate should be called within a session:

 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

 Session session = sessionFactory.openSession();

 session.beginTransaction();

 // DB operations - select, save, update and/or delete

 session.getTransaction().commit();   

 

Select

We can get an object from database using session.get, passing the class type and the primary key.

User u = (User)session.get(User.class, 1);

System.out.println(u.getName());

 

Note:

  • Primary key is identified using the @Id annotated field in the entity class.

  • If you do not have an entry created in database with the specified id, you will get a null object

    • and if you don't handle it, you will ger a NullPointerException.

  • Caution: If the hbm2ddl.auto property is create, the existing schema will be deleted.

 

You can also use load to get data from database. You can have a look at the differences between get and load here: http://javajee.com/forum-topic/what-are-the-differences-between-get-and-...

 

Save

We can save an object into the database using session.save:

User u = new User();

u.setId(1);

u.setName("Sample");

session.save(u);

 

Note:

  • If the hbm2ddl.auto property is update, and if you try to save the same object twice, you will get org.hibernate.exception.ConstraintViolationException wrapped around java.sql.BatchUpdateException: Duplicate entry.

    • If an object is already present, you have to use update() method instead of save().

      • However if the object is not present and you try to update, you will get org.hibernate.StaleObjectStateException.

        • You may also use saveOrUpdate() method to avoid both of the above problems.

 

Example: If the hbm2ddl.auto property is update, and if you try to save the same object twice, it will throw exception: 

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

java.sql.BatchUpdateException: Duplicate entry '1' for key 'PRIMARY'

 

The saveOrUpdate() Method

The saveOrUpdate() will first do a select query, and from the result:

  • if it see that the record is not already present in the database, it will execute save (insert);

  • if it see that the record is there and property data has changed, it will execute an update; and

  • if it see that the record is there and property data has not changed, it will not execute anything.

 

Using saveOrUpdate() wth auto-generated ID type

If your persistent object is using an auto-generated ID type, the saveOrUpdate() method treat an empty ID value as a new object that should be inserted into the database. Otherwise, if the ID value is not empty, Hibernate treats it as an existing object and update it.

Primitive data types are given default values in Java, so they cannot be empty. Hence, you should assign a number as the unsaved value:

<id name="empId" type="long" column="EMPID" unsaved-value="0">

<generator class="native"/>

</id>

A better alternative is to use a primitive wrapper class as your ID type (e.g. java.lang.Long) as it can be assigned with null.

 

Update

We can update an object in database using session.update:

User u = new User();

u.setId(1);

u.setName("Sample1");

session.update(u);

 

Note:

  • If you run the test class again and again with the same id, the update query is executed every time we execute session.update() even if value has not changed.

    • You may use session.saveOrUpdate(u) here, as it won’t call the update query if the property data has not changed.

    • To avoid running update if the data has not changed, you may also use the annotation @SelectBeforeUpdate(true) over the entity. Every time you execute session.update(), hibernate will first do a select query, check if data is different and if different, execute the update request. 

  • If you do update for a record which is not already present, you will get exception: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)...

    • You may use session.saveOrUpdate(), which will do an insert or update or no operation based on the situation.

  • The update is also called automatically (without an explicit update call) when the object is attached to a session. 

 

Example: @SelectBeforeUpdate(true)

import javax.persistence.Entity;

@Entity

@SelectBeforeUpdate(true)

public class User {

 

Delete

We can delete an object in database using session.delete:

User u = new User();

u.setId(1);

u.setName("Sample1");

session.delete(u);

 

Note:

  • The session.delete() method first do a select query to see if a matching record is present and then fires a delete request only if a matching record is found.
Tags: 

Search the Web

Custom Search

Searches whole web. Use the search in the right sidebar to search only within javajee.com!!!