hibernate database returned no natively generated

本文探讨了在使用Hibernate时遇到的MySQL数据库返回非自动生成ID值的问题,详细解释了如何检查和修改数据库表结构以确保ID字段为自增长属性,通过实例演示了正确的建库方式及hbm.xml配置。

database returned no natively generated 分类:Hibernatehbm.xml中的配置如下:

<id name="logId" type="integer" column="LOGID">
   <generator class="native"/>
</id>

 

native的功能是:

由数据库从identity,sequence和hilo中选取一个生成器来生成ID。

这样就需要主键设置成自增长的,一定要小心

 

采用的是Mysql5数据库,但在执行插入的时候报错:

The database returned no natively generated identity value

 

查看数据库中该字段是否应该设为自增长,若应该,设为自增长;若不是,则删除  <generator class="native"/>

最后确认原因是数据库的表结构中关于logid,没有设置auto increment。

正确的建库如下:

CREATE TABLE `log` (                        
          `LOGID` int(11) NOT NULL auto_increment,  
          `LOGUSER` varchar(10) default NULL,       
          `LOGTIME` datetime default NULL,          
          `LOGTYPE` char(1) default NULL,           
          PRIMARY KEY  (`LOGID`)                    
        ) ENGINE=InnoDB DEFAULT CHARSET=gbk

完整的hbm.xml如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping 
 package="com.shinyv.dao.hibernate.test">

 <class name="Log" table="log" proxy="Log" dynamic-insert="true" dynamic-update="true">
  <id name="logId" type="integer" column="LOGID">
   <generator class="native"/>
  </id>
  <property name="logTime" column="LOGTIME" not-null="true"/>
  <property name="userName" type="string" column="LOGUSER"/>
  <property name="logType" column="LOGTYPE"/>
 </class>
 
</hibernate-mapping>

### 高斯数据库中捕获 `query returned no rows when process into` 错误的解决方案 在高斯数据库或其他关系型数据库中,当执行 SQL 查询并将结果存储到变量时,如果查询未返回任何行,则可能会触发异常。这种行为可以通过 PL/pgSQL 中的异常处理机制来解决。 #### 异常处理方法 在 PL/pgSQL 脚本中,可以使用 `EXCEPTION WHEN NO_DATA_FOUND THEN` 来捕获此类错误并采取相应的措施[^1]。以下是具体的实现方式: ```plpgsql DO $$ BEGIN -- 假设有一个查询语句尝试将单行数据赋值给变量 PERFORM some_column INTO some_variable FROM some_table WHERE condition; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE NOTICE 'No data found for the given query'; END; $$ LANGUAGE plpgsql; ``` 在此代码片段中,`PERFORM ... INTO` 是一种常见的模式,用于将查询结果分配给变量。如果没有找到匹配的数据行,则会抛出 `NO_DATA_FOUND` 异常,并进入 `EXCEPTION` 块中的逻辑进行处理[^1]。 #### 数据验证与默认值设置 为了避免程序因缺少数据而中断,可以在异常处理部分为变量提供默认值或记录日志以便后续分析。例如: ```plpgsql DO $$ DECLARE some_variable TEXT := NULL; -- 初始化变量 BEGIN SELECT column_name INTO some_variable FROM table_name WHERE condition; IF some_variable IS NULL THEN RAISE NOTICE 'The variable was set to default value due to missing data.'; some_variable := 'default_value'; -- 设置默认值 END IF; EXCEPTION WHEN OTHERS THEN RAISE NOTICE 'An unexpected error occurred: SQLSTATE=%, SQLERRM=%', SQLSTATE, SQLERRM; END; $$ LANGUAGE plpgsql; ``` 此脚本不仅能够捕获无数据的情况,还能够在其他意外情况发生时打印详细的错误信息。 #### 推荐实践 为了提高系统的健壮性和可维护性,建议采用以下策略: - **预定义异常**:对于已知可能出现的异常(如 `NO_DATA_FOUND`),应显式编写对应的处理逻辑。 - **日志记录**:无论是在正常流程还是异常处理过程中,都应对重要事件进行日志记录,便于排查问题。 - **单元测试**:针对涉及复杂业务逻辑的存储过程或函数,需设计全面的单元测试用例以覆盖各种边界条件。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值