item.getId() // The database identity is "1234"
Session session= sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Item item2 = (Item) session.get(Item.class, new Long(1234));
Item item3 = (Item) session.merge(item);
(item == item2) // False
(item == item3) // False
(item2 == item3) // True
The merge(item) call results in several actions. First Hibernate checks whether a persistent instance in the persistence context has the same database identifier as the detached instance you're mergeing. In this case, this is true: item and item2, which were loaded with get(), have the same primary key value.
Second, If there is an equal persistent instance in the persistence context, Hibernate copies the state of the detached instance onto the persistence instance. In other words, the new description that has been set on the detached item is also set on the persistent item2.
Third, if there is no equals persistent instance in the persistence context, Hibernate loads it from the database(get() method) and then merges the detached state with the retrieved object's state.