Engineering Full Stack Apps with Java and JavaScript
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.
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();
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-...
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() 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.
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 {
…
We can delete an object in database using session.delete:
User u = new User();
u.setId(1);
u.setName("Sample1");
…
session.delete(u);
Note: