日期:2014-05-17  浏览次数:20710 次

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>