hibernate连接Mysql数据库为什么可以更新,查找和删除但是就不能插入数据
hibernate连接Mysql数据库为什么可以更新,查找和删除但是就不能插入数据
其他描述:
数据库表:
guestbook
id int primary key
username varchar(20)
password varchar(20)
数据库guestbook的导出xml文件为:Guestbook.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.ssh.guestbook.Guestbook" table="guestbook" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="username" type="java.lang.String">
<column name="username" />
</property>
<property name="password" type="java.lang.String">
<column name="password" />
</property>
</class>
</hibernate-mapping>
对数据库的操作为:
Session session = HibernateSessionFactory.getSession();
Transaction t = session.beginTransaction();
List list = null;
Query q = null;
Guestbook gb = new Guestbook();
// 查询所有的记录
System.out.println("查询所有的记录");
q = session.createQuery("from Guestbook");
list = q.list();
System.out.println(list.size());
for (int i = 0; i <list.size(); i++) {
gb = (Guestbook) list.get(i);
System.out.println("id:" + gb.getId() + ",name:" + gb.getUsername()
+ ",password:" + gb.getPassword());
}
gb=null;
// 更新一条记录
System.out.println("更新一条记录");
gb = (Guestbook) session.get(Guestbook.class, new Integer(1));
if(gb!=null){
gb.setPassword("zwy");
t.begin();
session.saveOrUpdate(gb);
t.commit();
System.out.println("更新一条记录成功");
}
// 查询所有的记录
System.out.println("查询所有的记录");
q = session.createQuery("from Guestbook");
list = q.list();
for (int i = 0; i <list.size(); i++) {
gb = (Guestbook) list.get(i);
System.out.println("id:" + gb.getId() + ",name:" + gb.getUsername()
+ ",password:" + gb.getPassword());
}
//删除一条记录
System.out.println("删除一条记录");
gb=null;
gb=(Guestbook)session.get(Guestbook.class, new Integer(2));
if(gb!=null){
t.begin();
session.delete(gb);
t.commit();
}
// 查询所有的记录
System.out.println("查询所有的记录");
q = session.createQuery("from Guestbook ");
list = q.list();
for (int i = 0; i <list.size(); i++) {
gb = (Guestbook) list.get(i);
System.out.println("id:" + gb.getId() + ",name:" + gb.getUsername()
+ ",password:" + gb.getPassword());
}
session.close();
此操作的结果为:
查询所有的记录
Hibernate: select guestbook0_.id as id0_, guestbook0_.username as username0_, guestbook0_.password as password0_ from test.guestbook guestbook0_
2
id:1,name:zhou,password:zwy
id:2,name:sd,password:sd
更新一条记录
更新一条记录成功
查询所有的记录
Hibernate: select guestbook0_.id as id0_, guestbook0_.username as username0_, guestbook0_.password as password0_ from test.guestbook guestbook0_
id:1,name:zhou,password:zwy
id:2,name:sd,password:sd
删除一条记录
Hibernate: delete from test.guestbook where id=?
查询所有的记录
Hibernate: select guestbook0_.id as id0_, guestbook0_.username as username0_, guestbook0_.password as password0_ from test.guestbook guestbook0_
id:1,name:zhou,password:zwy
但是使用插入操作时就会发生如下错误:
插入语句为:
gb.setId(711);
gb.setUsername("zhou");
gb.setPassword("123");
t.begin();
session.save(gb);
t.commit();
错误为:
Exception in thread "main" org.hibernate.HibernateException: The database returned no natively generated identity value
问题如上所述,望各位大大们能帮助小弟解决这个问题,不甚感谢!!!
[解决办法]
你的Guestbook数据表里面的主健 id 是自增长的吗?极有可能使你忘了让它自增长了
[解决办法]
ls正解,要不你就把你的配置文件改成 <id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id> 试试,嘿嘿不过这样很容易主键冲突一般都不这么做
[解决办法]
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
好像你不是设置自增的值吧?
The database returned no natively generated identity value 翻译过来就是:数据库返回的不是一个自增的值.
[解决办法]
gb.setId(711);
gb.setUsername("zhou");
gb.setPassword("123");
t.begin();
session.save(gb);
t.commit();
在插入时,gb.setId(711),这种做法是错误的,因为你的Guestbook.hbm.xml
中的id生成是native类型的,相对于mysql就是increase,相对于ORACLE就是suquence (哈,单词不会打了,就是mysql是自动增长,oracle是序列)
就是说id由数据库自己生成,在插入时不能指定,一般在POJO中,都把setId设置为private不允许外界设置
也就是说你在插入操作时,不需要setId:
gb.setUsername("zhou");
gb.setPassword("123");
t.begin();
session.save(gb);
t.commit();
即可