这种错误都是没有写对SQL语句,执行的时候保存。更多的是在select 很长的地方少写一个逗号。
Oracle 如果有版本号这样的乐观锁悲观锁。。那么不只是id来判断是不是为空。。需要将这个属性也加上。
如果没有写,被配置为version的这个字段。那么数据库也会报改对象为null的异常。 和没有主键id一样的错。
(注意,上面是关联对象的时候。子对象发生这样的情况。)
悲观锁: 在整个数据处理过程中,都是上锁状态,别人无法操作。
乐观锁:一般是版本号机制。在最后修改的时候,会进行一个验证。
**下面是看别人文章摘一些。
数据库的悲观锁机制
select * from account where name=”Erica” for update 。会将表account上锁。在事务提交的时候,会将锁给释放
hibernate的悲观锁机制
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); // 加锁
Hibernate 的加锁模式有:
LockMode.NONE : 无锁机制。
LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动
获取。
LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update
过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
LockMode.UPGRADE :利用数据库的 for update 子句加锁。
LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for
update nowait 子句实现加锁。
乐观锁:
hibernate中的乐观锁:
对表设置该属性。
optimistic-lock 属性有如下可选取值:
none
无乐观锁
version
通过版本机制实现乐观锁
需要对version字段,配置version。xml配置,需配在id之后。
dirty
通过检查发生变动过的属性实现乐观锁
all
通过检查所有属性实现乐观锁