I am using the latest
4.3.8 version of Hibernate.
I have the following
JUinit test working code but some behaviors I cannot understand.
By reading the manual, the changes of a
persistent object will be saved to database after the
flush(). But I look at the database table, after the Step 7. the changes, "updatePassword2" and the new permission, are not saved to the database table.
The Step 7 actually closes the session and the persistent object is changed to detached object.
Step 8 is
another session and call
get() to retrieve the row. But to my surprise, Step 6's changes are written to database in
this get() call but not the Step 7
flush() and
close().
Note, I disable/enable code step by step and query the database from outside to get above result.
EDIT: In Step 8, if I disable the get() statement, just leave the Transaction there, it will write the changes into database. Cannot understand.
How do I know when the modified persistent object or detached object will be written to database?Code:
//Step 1: create transient object
Session session = HibernateDBUtil.getSession();
String pwd = "password";
UserAccount newUser = new UserAccount("testUpdate001", //String username,
pwd,//String password,
false,//boolean isDeleted,
false, //boolean isLocked,
new Date(),//Date lastPwdModify,
(short)0, //short loginFailedCount,
false, //boolean isTempPwd,
"Test", //String firstName,
"Unit", //String lastName,
new Date(), //Date userAccountCreateDateTime,
new Date() //Date userAccountUpdateDateTime
);
//Step 2: save to database
Transaction tx = session.beginTransaction();
long newId = ((Number)session.save(newUser)).longValue();
session.flush();
tx.commit();
//Step 3: get back and get the persistent object
tx = session.beginTransaction();//to avoid dirty read
UserAccount loadedObj = (UserAccount)session.get(UserAccount.class, newId);
tx.commit();
Assert.assertNotNull(loadedObj);
Assert.assertEquals(loadedObj.getPassword(), pwd);
Assert.assertEquals(loadedObj.getUserPermissions().size(), 0);
//Step 4: change the persistent object
Set<UserPermission> permissions = new HashSet();
permissions.add(RuntimeDataStore.getUserPermission(UserPermissionEnum.Operator));
permissions.add(RuntimeDataStore.getUserPermission(UserPermissionEnum.Manager));
newUser.setUserPermissions(permissions);
String newPwd = "updatedPassword";
newUser.setPassword(newPwd);
//Step 4: update the changes onto database
tx = session.beginTransaction();
session.saveOrUpdate(newUser);
session.flush();
tx.commit();
//Step 5: get back the persistent object
tx = session.beginTransaction();//to avoid dirty read
loadedObj = (UserAccount)session.get(UserAccount.class, newId);
tx.commit();
Assert.assertEquals(loadedObj.getPassword(), newPwd);
Assert.assertEquals(loadedObj.getUserPermissions().size(), 2);
//Step 6: modify the persistent object again
loadedObj.getUserPermissions().add(RuntimeDataStore.getUserPermission(UserPermissionEnum.TechnicalLeader));
String newPwd2 = "updatedPassword2";
loadedObj.setPassword(newPwd2);
//Step 7: flush and close the session to make above change onto database
session.flush();
session.close();
//Step 8: start another session and get the data from database
session = HibernateDBUtil.getSession();
tx = session.beginTransaction();
loadedObj = (UserAccount)session.get(UserAccount.class, newId);
tx.commit();
Assert.assertEquals(loadedObj.getPassword(), newPwd2);
Assert.assertEquals(loadedObj.getUserPermissions().size(), 3);