hibernate 保存对象时,根据映射文件,无法获取主键值
错误是: ORA-01400: 无法将 NULL 插入 ("SUNSC"."TEST"."ID")
就是缺失了一个主键的ID的值
在Console 看到 hibernate show_sql 生成的语句
[insert into SUNSC.TEST (USERNAME, STYLE) values (?, ?)]
缺少了主键ID字段
insert语句要执行成功是要这样的
[insert into SUNSC.TEST (USERNAME, STYLE, ID) values (?, ?, ?)]
就是HQL语句中主键ID字段不显示,就保存不到数据库(数据库中的表的ID设置不能为空),所以报错
Test.hbm.xml
<hibernate-mapping>
<class name="com.hui.test.bean.Test" table="SUNSC.TEST">
<id name="id" type="java.lang.Long">
<column name="ID" precision="15" scale="0" />
<generator class="native" />
</id>
<property name="username" type="java.lang.String">
<column name="USERNAME" length="40"/>
</property>
<property name="style" type="java.lang.String">
<column name="STYLE" length="50" />
</property>
</class>
</hibernate-mapping>
假如我把映射文件去掉紫色那部分,在从JSP表单传个值给ID,就能成功
Test.hbm.xml
<hibernate-mapping>
<class name="com.hui.test.bean.Test" table="SUNSC.TEST">
<id name="id" type="java.lang.Long">
<column name="ID" precision="15" scale="0" />
<generator class="native" />这里部分去掉,就能保存到数据库中
</id>
<property name="username" type="java.lang.String">
<column name="USERNAME" length="40"/>
</property>
<property name="style" type="java.lang.String">
<column name="STYLE" length="50" />
</property>
</class>
</hibernate-mapping>
ACTION 和 DAO接口实现类中 都是以对象为参数,对象中的ID也都是为空,
是不是映射文件主键设置有问题,还是ORACLE数据库中建的TEST表有问题,有经验的大大帮助下,谢谢
------最佳解决方案--------------------[quote=引用:]
1 原因太清楚了,native是数据库自己去维护主键,hibernate当然不会给你生成
insert into SUNSC.TEST (USERNAME, STYLE, ID) values (?, ?, ?),给id赋值不是多此一举吗
不管主键生成策略是怎么样的,hibernate生成的insert语句都要插入id的,楼主看看其他代码哪里写错了吧!
------其他解决方案--------------------1 原因太清楚了,native是数据库自己去维护主键,hibernate当然不会给你生成
insert into SUNSC.TEST (USERNAME, STYLE, ID) values (?, ?, ?),给id赋值不是多此一举吗
2 404更简单,404就说明启动出错了
90%是没改数据库方言,它用没sequence的方言类去检查有sequence的配置文件,当然出错了。
------其他解决方案--------------------Oralce 的主键自动增长需要创建sequence!
而在Hibernate配置主键自动生成策略需要用到另外一个值、就是sequence而不在是native
在Oralce创建一个TESTSEQ的sequence:
create sequence TESTSEQ
minvalue 1
maxvalue 999999999
start with 1
increment by 1
nocache;
hbm主键配置:
<id name="id" type="java.lang.Long">
<column name="ID" precision="15" scale="0" />
<generator class="sequence">
<param name="sequence">TESTSEQ</param>
</generator>
</id>