session.save()
2018-05-20 本文已影响8人
游牧族人
先理解hibernate对象三种持久化状态。
首先,session.save()方法的功能将对象持久化到数据库中,对应到数据库中就是一条insert语句。session.save()方法的返回值为插入到数据库中的主键值。
当我们期望session.save()方法返回给我们期望的主键值时,我们必须手动合适的设置数据库的主键生成策略。否则可能会获取不到我们期望的主键值。
例如:
此时我们如果不设置kind_id便插入到数据库中,session.save()的返回值便为0。即使他在数据库中插入的id不为0。
然而当我们设置的主键生成策略与数据表中生成策略不符时,便会报异常。
这时我们不设置kind_id便把数据插入到数据库中时,他也会返回记录插入的id值。
持久化之前的输出:
持久化之后的输出:
总结:
使用hibernate时请设置好合适的主键生成策略,避免使用默认的程序设置主键生成策略,否则会出现数据持久化的各种异常。
自己遇到过的异常信息:
1、使用了默认的主键生成策略(即程序手动设置主键),同时并没有在持久化过程中手动设置主键,导致以下问题:
在同一个事务中无法save()之后继续修改持久化对象再次save()。
在同一个事务中无法save()两个不同的实例对象。
无法准确获得插入记录的主键值。