首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

hibernate 保留对象时,根据映射文件,无法获取主键值

2012-12-24 
hibernate 保存对象时,根据映射文件,无法获取主键值错误是: ORA-01400: 无法将 NULL 插入 (SUNSC.TEST

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>

------其他解决方案--------------------


引用:
native在mysql里面可以用
 呃,能自增数据库的都能用
[其他解释]
不是配置文件的问题,
[其他解释]
native在mysql里面可以用
[其他解释]
恩 这也试过的,假如我写成
<id name="id" type="java.lang.Long">
            <column name="ID" precision="15" scale="0" />
            <generator class="sequence">
                <param name="sequence">TESTSEQ</param> 
            </generator>
</id>
但是我把ID值  直接 <param name="sequence">TESTSEQ</param> 同时在数据库中也建立了,但是启动TOMCAT之后打不开页面了 
[其他解释]
直接写<param name="sequence">TESTSEQ</param>
 TOMCAT启动之后就是直接404页面了

热点排行