当前位置:编程学习 > JAVA >>

Hibernate中调用session.save()如何确定是否保存成功

我现在要做一个注册的功能

配置文件如下:

<hibernate-mapping package="entity">
<class name="Member" table="MEMBER">
<id name="id" column="ID" type="integer">
<generator class="increment"></generator>
</id>

<property name="username" unique="true" length="12" column="USERNAME" type="string" />
<property name="password" length="12" column="PASSWORD" type="string" />
<property name="admin" column="ADMIN" type="yes_no" />
</class>
</hibernate-mapping>

username是有唯一约束的


注册的方法如下:

public boolean regist(Member m) {
Session session = HibernateUtil.getSession();
Transaction ts = session.beginTransaction();

boolean result = false;
try {
session.save(m);
result = true;
} catch (Exception e) {
}

ts.commit();
HibernateUtil.closeSession();
return result;
}



现在我遇到的问题是:
①:在调用save方法后,我如何确定是否添加成功了!!!我的设想是判断session.contains(obj)这样来判断是否添加成功!但是问题出现在了②
②我已经try-catch了session.save(obj);方法了,为什么出现了异常后,程序还是马上停掉了,它的异常到底是怎么设计的捏。。。

请大神帮忙 谢谢,小弟是hibernate新手
--------------------编程问答-------------------- session.save(m);之后无法判断是否成功添加,只能判断是否成功执行。
因为只有commit之后才能判断添加成功还是失败。

出错之后,程序停掉是什么意思,不执行还是其他的现象?! --------------------编程问答--------------------
引用 1 楼 NNTT2010 的回复:
session.save(m);之后无法判断是否成功添加,只能判断是否成功执行。
因为只有commit之后才能判断添加成功还是失败。

出错之后,程序停掉是什么意思,不执行还是其他的现象?!


比如我数据库里已经有一条记录了username="admin"
然后我现在又添加了一条记录username也等于"admin",而我弄得表中username是有唯一约束的,
这时候肯定是会报错的啊,但是我已经try-catch了session.save()方法了,按理说没有保存成功但是程序还是会往下走啊。。。但是这里它是直接就停掉了,没有往下走了 --------------------编程问答--------------------
引用 1 楼 NNTT2010 的回复:
session.save(m);之后无法判断是否成功添加,只能判断是否成功执行。
因为只有commit之后才能判断添加成功还是失败。

出错之后,程序停掉是什么意思,不执行还是其他的现象?!
--------------------编程问答--------------------
引用 3 楼 u011512492 的回复:
Quote: 引用 1 楼 NNTT2010 的回复:

session.save(m);之后无法判断是否成功添加,只能判断是否成功执行。
因为只有commit之后才能判断添加成功还是失败。

出错之后,程序停掉是什么意思,不执行还是其他的现象?!

出现异常后,连保存成功或者是失败的语句都么有打印 --------------------编程问答-------------------- 首先这个问题先放下,你的数据库设计就不应该用username做为主键,一般情况下,业务字段尽量避免做为主键,不然到时候业务庞大后很难扩展
其次,对于你上述问题,hibernate内部也是拿到本身表中最大的主键值或是seq然后+1,如果你用username,不一定他会这样做。
再不然,就看看是否主键符合JPA的规范,在主键上注解@Id --------------------编程问答-------------------- 在ts.commit()才会向数据库发sql。所以你把这句加到result = true;之前.
ts.commit(); // here add
result = true;
--------------------编程问答-------------------- 过来学习一下~~      嘿嘿~~ --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 5 楼 hp0632 的回复:
首先这个问题先放下,你的数据库设计就不应该用username做为主键,一般情况下,业务字段尽量避免做为主键,不然到时候业务庞大后很难扩展
其次,对于你上述问题,hibernate内部也是拿到本身表中最大的主键值或是seq然后+1,如果你用username,不一定他会这样做。
再不然,就看看是否主键符合JPA的规范,在主键上注解@Id

+1
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,