当前位置: 代码迷 >> Java Web开发 >> Hibernate4中的事宜
  详细解决方案

Hibernate4中的事宜

热度:9463   发布时间:2016-04-10 22:54:53.0
Hibernate4中的事务
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
 

 
  相关解决方案