Tuser t = userDao.get("from Tuser t where t.name = 'admin' and t.id != 'admin'");
if (t != null) {
t.setName(UUID.randomUUID().toString());
}
上面的执行结果如下:
Hibernate:
select
tuser0_.ID as ID1_,
tuser0_.CREATEDATETIME as CREATEDA2_1_,
tuser0_.MODIFYDATETIME as MODIFYDA3_1_,
tuser0_.NAME as NAME1_,
tuser0_.PWD as PWD1_
from
T_USER tuser0_
where
tuser0_.NAME=?
and tuser0_.ID<>'admin'
Hibernate:
update
T_USER
set
CREATEDATETIME=?,
MODIFYDATETIME=?,
NAME=?,
PWD=?
where
ID=?
Tuser t = userDao.get("from Tuser t where t.name = 'admin' and t.id != 'admin'");
if (t != null) {
t.setName(UUID.randomUUID().toString());
}
Tuser admin = new Tuser();
admin.setId("admin");
admin.setName("admin");
admin.setPwd(Encrypt.e("admin"));
admin.setModifydatetime(new Date());
userDao.saveOrUpdate(admin);
这个的运行结果:
Hibernate:
select
tuser0_.ID as ID1_,
tuser0_.CREATEDATETIME as CREATEDA2_1_,
tuser0_.MODIFYDATETIME as MODIFYDA3_1_,
tuser0_.NAME as NAME1_,
tuser0_.PWD as PWD1_
from
T_USER tuser0_
where
tuser0_.NAME=?
and tuser0_.ID<>'admin'
Hibernate:
select
tuser_.ID,
tuser_.CREATEDATETIME as CREATEDA2_1_,
tuser_.MODIFYDATETIME as MODIFYDA3_1_,
tuser_.NAME as NAME1_,
tuser_.PWD as PWD1_
from
T_USER tuser_
where
tuser_.ID=?
Hibernate:
insert
into
T_USER
(CREATEDATETIME, MODIFYDATETIME, NAME, PWD, ID)
values
(?, ?, ?, ?, ?)
少了上面的更新语句,由于我的name是唯一的,所以会产生
ORA-00001: 违反唯一约束条件 (ORCL.U_T_USER_NAME)
哪位大神能帮帮忙
------解决方案--------------------
Tuser t = userDao.get("from Tuser t where t.name = 'admin' and t.id != 'admin'");
if (t != null) {
t.setName(UUID.randomUUID().toString());
}
userDao.saveOrUpdate(t);
Tuser admin = new Tuser();
admin.setId("admin");
admin.setName("admin");
admin.setPwd(Encrypt.e("admin"));
admin.setModifydatetime(new Date());
userDao.saveOrUpdate(admin);
------解决方案--------------------
首先从第一个列子来看:通过session.get或load或缺的实体此时它处理持久状态(Persistent),此状态下
1、每个持久态对象都于一个Session对象关联
2、处于持久态的对象是于数据库中的记录相关联的
3、Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录
所以在你修改它的name值的时候他会与数据库同步所以就会发出update语句.
再看第二个列子:首先hibernate是先执行查询语句的也就是select语句,再去执行insert语句最后在去执行update,delete语句,因为你name是唯一的所以在执行insert的时候就报错了它就不会执行update语句了,如果想先执行update可以在修改name后执行flush