This tutorial resolve the issue of User think time : ( one user edit the record for update and thinking and changing values , same time other user edit the same record and update. then first user update and 2nd user's data is lost.)
You can say this is version checking in Hibernate or perevent slate object updatation in Hibernate. version checking used in hibernate when more then one thread trying to access same data.
For example :
User A edit the row of the TABLE for update ( In the User Interface changing data - This is user thinking time) and in the same time User B edit the same record for update and click the update. Then User A click the Update and update done. Chnage made by user B is lost.
In hibernate you can perevent slate object updatation using version checking.
Check the version of the row when you are upding the row.
Get the version of the row when you are fetching the row of the TABLE for update.
On the time of updation just fetch the version number and match with your version number ( on the time of fetching).
Below steps to prevent concurrent update in Hibernate.
Step 1. Declare a variable "versionId" in your bean Class with setter and getter method.
public class Writer { |
| create table WRITER ( ID number, //PRIMARY KEY NAME varchar, version number ); |
| <?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="Writer" table="WRITER" optimistic-lock="version"> <id name="id" column="ID" type="int" unsaved-value="0"> <generator class="increment"/> </id> <property name="name" column="NAME" type="string"/> <version name="versionId" type="long" column="version" /> </class> </hibernate-mapping> |
| <?xml version='1.0' encoding='utf-8'?> <lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/techfaqdb</property> <property name="connection.username">techfaq</property> <property name="connection.password">techfaq</property> <!-- JDBC connection pool (use the built-in) --> <property name="hibernate.c3p0.min_size">1</property> <property name="hibernate.c3p0.max_size">4</property> <property name="hibernate.c3p0.timeout">1800</property> <property name="hibernate.c3p0.max_statements">50</property> <!-- MySQL dialect//different for different Database --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource="writer.hbm.xml"/> </session-factory> </hibernate-configuration> |
When you are updating the table just check the version with you and the current version in the table.
You can handle StaleObjectStateException() and do what ever you want.
You can display error message.
Hibernate autumatically create/update the version number when you update/insert any row in the table.
In the code |
Posted in: