职业课程 > 员工信息系统 6 章、权限模块的开发
客服QQ:1206116161
Crow

做设置角色权限时候出现一个不能插入数据的问题

Crow 于 2018-05-07 09:00:20 发起求助
(346)
(15)
举报

控制台的输出

SQL Error: 0, SQLState: S1009 - [WARN] [2018-05-07 08:51:12,194] 

Connection is read-only. Queries leading to data modification are not allowed - [ERROR] [2018-05-07 08:51:12,194] 

org.hibernate.exception.GenericJDBCException: could not insert: [edu.wz.ces.model.RoleModule]



具体代码是这个

public JSONReturn setRoleSecureValid(long roleId, String moduleCode, int type,boolean add) {

Module m = moduleDao.findUniqueByProperty("moduleCode", moduleCode);

if(m == null){

return JSONReturn.buildFailure("模块不存在!");

}

Role role = roleDao.findById(roleId);

if(role == null){

return JSONReturn.buildFailure("角色不存在!");

}

RoleModule roleModule = roleModuleDao.findByRoleLabelAndModuleCode(role.getRoleLabel(), m.getModuleCode());

if(roleModule == null){

roleModule = new RoleModule(role.getRoleLabel(), moduleCode, m.getModuleSuperCode(),false, false, false, false);

System.out.println(roleModule.toString());

roleModuleDao.save(roleModule);

}

roleModule = setRoleSecureValid(roleModule, type, add);

return JSONReturn.buildSuccessWithEmptyBody();

}

public RoleModule setRoleSecureValid(RoleModule rm, int type, boolean add) {

if (type == TYPE_FIND)

rm.setFinds(add);

else if (type == TYPE_DELETE)

rm.setDeletes(add);

else if (type == TYPE_ADD)

rm.setAdds(add);

else

rm.setModifys(add);

return rm;

}



是在roleModuleDao.save(roleModule);的时候出错的;


roleModule这个对象的toString打印出来是RoleModule [id=0, timestamp=null, roleLabel=cf70b969-19e8-45aa-9908-6a5616b61632, moduleCode=03001, moduleSuperCode=03, finds=false, adds=false, deletes=false, modifys=false]



个人感觉没什么问题,就是会错


  • _Kiro
    _Kiro - 05月07日 (0)

    应该是你的Service方法上或类上面没有添加@Transactional注解,或者将事务注解写成了只读@Transactional(readOnly=true)


  • Crow
    Crow - 05月07日 (0)

    在把类上的@Transactional(readOnly = true)该成@Transactional后

    重启服务器后,出现如下报错


    methodName=edu.wz.ces.service.impl.ModuleServiceImpl@140acbb|setRoleSecureValid - [INFO] [2018-05-07 09:20:35,642] 

    arg[0] -> 6 - [INFO] [2018-05-07 09:20:35,642] 

    arg[1] -> 02001 - [INFO] [2018-05-07 09:20:35,642] 

    arg[2] -> 1 - [INFO] [2018-05-07 09:20:35,642] 

    arg[3] -> true - [INFO] [2018-05-07 09:20:35,642] 

    return: edu.wz.ces.service.impl.ModuleServiceImpl@140acbb|setRoleSecureValid - JSONReturn [head=true, body=] - [INFO] [2018-05-07 09:20:35,642] 

    Could not synchronize database state with session - [ERROR] [2018-05-07 09:20:35,651] 

    org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [edu.wz.ces.model.RoleModule#2]

    at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1714)

    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2357)

    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2257)

    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2557)

    at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)

    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)

    at org.hibernate.engine.ActionQueue.executeActions(Act......


  • Crow
    Crow - 05月07日 (0)

    我跟视频里不同的是,我给自己的roleModule的数据表加了乐观锁字段,

    但是我其他实体都有乐观锁,也没出现问题

  • Crow
    Crow - 05月07日 (0)

    百度问题后,查到此问题是跟乐观锁有关,version不同引起的,这个乐观锁我还不了解,只是我其他实体都没出现此问题

  • Crow
    Crow - 05月07日 (0)

    我查看数据库了,表的自增有变化,说明插入数据有成功,可能是乐观锁的原因回滚了

  • Crow
    Crow - 05月07日 (0)

    原系统代码里面是有设置乐观锁的,就是不知道为什么我的会错误

    Crow
    _Kiro - 05月07日 (0) @ Crow

    你把建表的SQL语句贴出来看下

  • Crow
    Crow - 05月07日 (0)

    DROP TABLE IF EXISTS `role_module`;

    CREATE TABLE `role_module` (

      `id` BIGINT(20) NOT NULL AUTO_INCREMENT,

      `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

      `roleLabel` VARCHAR(64) DEFAULT NULL COMMENT '唯一角色标识',

      `moduleCode` VARCHAR(24) DEFAULT NULL,

      `moduleSuperCode` VARCHAR(24) DEFAULT NULL COMMENT '上级',

      `finds` TINYINT(1) DEFAULT '0' COMMENT '查询',

      `adds` TINYINT(1) DEFAULT '0' COMMENT '增加',

      `deletes` TINYINT(1) DEFAULT '0' COMMENT '删除',

      `modifys` TINYINT(1) DEFAULT '0' COMMENT '修改',

      PRIMARY KEY (`id`)

    ) ENGINE=INNODB DEFAULT CHARSET=utf8


  • Crow
    Crow - 05月07日 (0)

    我看系统源代码里面的相应的impl类下也是设置的@Transactional(readOnly=true),并没有影响插入数据,很奇怪。



    Crow
    _Kiro - 05月07日 (0) @ Crow

    现在这个问题已经和事务没关系了,

    @transactional是解决之前的那个问题,


    roleModuleDao.save(roleModule);

    在这行代码下面加上return JSONReturn.buildSuccessWithEmptyBody();试试


    _Kiro
    _Kiro - 05月07日 (0) @ _Kiro

    return JSONReturn.buildSuccessWithEmptyBody();

    加在下面


  • Crow
    Crow - 05月07日 (0)

    可以,解决了一部分问题,可以插入数据了,但是出现的新问题是,在第一次给角色赋予权限的时候,就是点击checkBox的时候,只执行插入一条roleModule的数据就直接结束了方法,没有把checked的权限在数据库中设置为true。需要关掉弹窗再打开再点击第二次同样的checkBox,才能设置数据库中相应的数据的相应字段为true。

  • Crow
    Crow - 05月07日 (0)

    虽然麻烦点,也能实现功能,就是影响用户体验了

    Crow
    _Kiro - 05月07日 (1) @ Crow

    你首先要弄明白问题出在哪里,我的建议就是,在new对象和save对象的中间,就把权限赋值给加上去,这样save进去的数据就是已经赋值过后的数据,就不会存在你说的问题了

扫码关注TE官方微博 扫码关注TE官方微博
回复X
举报X