在学习使用Nutz的Fetch时,我是基于自己上一篇文章《Nutz Dao Hello World》进行的,
当时的Person类的主键声明如下:
@Table("TBL_PERSON") //声明了Person对象的数据表
public class Person {
/**
* (1)Oracle的字段没有自增的特性,使用Prev注释,在插入数据前查询序列,然后为表ID赋值
* (2)不能使用Next,因为估计Next是先附上默认值(int/long:0,Integer/Long:null等等),插入数据库后再更新,但是主键不允许为NULL及重复
*/
@Column // 表示该对象属性可以映射到数据库里作为一个字段
@Prev(@SQL("select SEQ_PERSON.NEXTVAL from dual"))
private Long Person_ID;
//其他
}
所以,当我使用:
dao.fetch(Person.class,44); //44是数据库记录中某Person记录的主键
会报错:
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = ']'
必须为主键增加@Id的注释声明。
但是,@Id是默认自增的,所以单纯的加上@Id仍然会报错,不是在fetch的时候报错,而是insert一条新数据是的时候:
dao.insert(p);
Exception in thread "main" org.nutz.dao.DaoException: !Nuz SQL Error: 'INSERT INTO TBL_PERSON(name,age) VALUES( 'Ivan2', 25)'
Caused by: java.sql.SQLException: ORA-01400: 无法将 NULL 插入 ("NUTZ"."TBL_PERSON"."PERSON_ID")
所以,正确的增加@Id注释的做法是:
@Table("TBL_PERSON") //声明了Person对象的数据表
public class Person {
/**
* (1)Oracle的字段没有自增的特性,使用Prev注释,在插入数据前查询序列,然后为表ID赋值
* (2)不能使用Next,因为Next是先附上默认值(int/long:0,Integer/Long:null等等),插入数据库后再更新,但是主键不允许为NULL及重复
*/
@Column // 表示该对象属性可以映射到数据库里作为一个字段
@Id(auto=false) // 表示该字段为一个非自增长的主键Id
@Prev(@SQL("select SEQ_PERSON.NEXTVAL from dual"))
private Long Person_ID;
问题得到了解决。
在解决此问题的过程中,曾经尝试将tbl_Person的主键约束去掉,此时使用insert将发生一个怪异现象,内存中的Person类在插入后,Person_ID有值,但是数据库中的对应记录的主键确为NULL。
发生该怪异现象的代码如下:
public class Person {
/**
* (1)Oracle的字段没有自增的特性,使用Prev注释,在插入数据前查询序列,然后为表ID赋值
* (2)不能使用Next,因为Next是先附上默认值(int/long:0,Integer/Long:null等等),插入数据库后再更新,但是主键不允许为NULL及重复
*/
@Column // 表示该对象属性可以映射到数据库里作为一个字段
@Id // 表示该字段为一个非自增长的主键Id
@Prev(@SQL("select SEQ_PERSON.NEXTVAL from dual"))
private Long Person_ID;
@Column
// @Name // 表示该字段可以用来标识此对象,或者是字符型主键,或者是唯一性约束
private String name;
@Column
private Integer age;
//empty constructor + getter + setter
//....
}
tbl_Person:
-- Create table
create table TBL_PERSON
(
PERSON_ID NUMBER(20), --无主键等任何约束
NAME VARCHAR2(100),
AGE NUMBER
)
tablespace NUTZ_DB
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 16K
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table TBL_PERSON
is '人类';
-- Add comments to the columns
comment on column TBL_PERSON.PERSON_ID
is '人类主键';
comment on column TBL_PERSON.NAME
is '姓名';
comment on column TBL_PERSON.AGE
is '年龄';
nutz.dao.insert:
Person p = new Person();
// p.setPerson_ID(123l);
p.setName("Hello World");
p.setAge(25);
dao.insert(p);
System.out.println(p);
//输出:
nuz.bean.Person@175d6ab[Person_ID=50,name=Ivan2,age=25]
但是数据库中的记录却是:
[null, 'Hello World', 25]
。。。望各位大侠指教个中原因,谢谢。
分享到:
相关推荐
然而,fetch默认并不提供请求和响应的拦截器,这对于需要进行全局处理,比如鉴权、错误处理等场景并不方便。本篇文章主要探讨如何使用JavaScript实现fetch请求返回的统一拦截。 首先,我们需要理解拦截器的目的。...
`electron-main-fetch`库就是为了满足这个需求而诞生的,它允许我们在Electron的主要进程中使用与浏览器相同的Fetch API。 Fetch API是一种现代、统一的接口,用于在Web上发起HTTP请求。它提供了异步操作,返回...
本文将详细解析如何使用JavaScript中的fetch API来实现文件的异步下载功能。首先,我们会介绍fetch API的基本用法,然后通过一个具体的实例代码来演示如何结合HTML和JavaScript来完成这一任务。 fetch API是现代...
Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据 Oracle 中的游标数据读取是数据库开发中非常常见的操作。通常,我们使用 fetch some_cursor into var1, var2 形式来获取游标数据,当游标中的记录数...
Fetch+Promise教程 Fetch API 是一种现代化的网络请求方式,旨在取代传统的 XMLHttpRequest。它提供了许多优点,包括链式调用的语法、返回 Promise 等。Fetch API 的概念和用法、Headers 对象、Request 对象等都是...
西门子PLC中的TCP通信主要包括FETCH和WRITE两种通信方式,这两种方式无需在PLC侧编程,只需要进行一些简单的配置即可实现与S5设备或PC的数据交换。 首先,我们需要使用带有FETCHWRITE功能的模块。在进行硬件组态后...
在Laravel框架中,"fetch"一词常常与数据查询关联,特别是在数据库操作时使用Eloquent ORM(对象关系映射)进行数据检索。本项目可能是一个关于如何在Laravel环境中利用fetch方法处理数据的示例或者教程。让我们深入...
在深入探讨Hibernate Fetch的作用之前,我们首先需要理解Hibernate框架本身以及其在持久化领域的重要性。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用,它提供了将数据库记录映射到对象的方法,使得...
Fetch Robot
《OracleFetch:Autonomy下的数据聚合与管理》 在当今数据驱动的世界中,高效的数据管理和检索成为了企业运营的关键。Autonomy公司推出的OracleFetch,作为一款专业的企业级数据聚合工具,为用户提供了强大的数据库...
**Node.js-d3-fetch模块详解** 在现代Web开发中,数据获取和处理是至关重要的环节。`d3-fetch`是一个非常实用的Node.js模块,它为开发者提供了基于Fetch API的便利扩展,使得在Node.js环境中处理HTTP请求变得更加...
fetch请求超时,在fetch的基础上做的可以设置超时时间的 javascript 插件,具体使用请查看我的博客 https://blog.csdn.net/yumikobu/article/details/80167982
【压缩包子文件的文件名称列表】"tedious-Fetch-ea3f1bb"看起来像是Fetch库的一个版本号或分支名。"tedious"可能表示这个版本在开发过程中可能是较为繁琐或复杂的,"ea3f1bb"很可能是Git仓库中的一个提交哈希,用于...
在iOS开发中,Background Fetch是一项重要的特性,它允许应用程序在后台执行特定的任务,即使用户并未直接与应用交互。这项技术极大地提升了用户体验,因为应用可以及时更新内容,如新闻、邮件或者社交媒体通知,而...
在IT行业中,`fetch`检索策略是一个非常关键的概念,特别是在数据库查询优化以及Web应用性能提升方面。本篇文章将深入探讨`fetch`检索策略的核心概念、作用以及如何在实际开发中应用这一策略。 `fetch`检索策略是...
前端项目-fetch,fetch是window.fetch的javascript polyfill。全局fetch函数是web请求和处理响应的简单方式,不使用xmlhttprequest。这个polyfill编写的接近标准的fetch规范。
标题中的“Node.js-node-fetch”指的是Node.js的一个第三方模块,名为`node-fetch`。这个模块的主要功能是将浏览器环境中的`window.fetch`API引入到Node.js和io.js环境中,使得在服务端也能方便地进行HTTP请求操作。...
JavaScript中的Fetch API是一种现代的、基于Promise的网络请求方法,用于替代传统的XMLHttpRequest。这个示例将详细讲解如何使用Fetch API来实现短信验证码的注册和登录功能,这在Web开发中是一个常见的用户验证机制...
`fetch_california_housing()`是Scikit-Learn(sklearn)库中的一个内置函数,用于获取加利福尼亚州住房数据集。这个数据集包含了加利福尼亚州不同区域的住房价格信息,常用于教学和演示机器学习算法,特别是回归...
react native 使用 fetch 进行网络请求,fetch 的封装以及调用实例 (fetch demo) 1》下载该文件 2》使用命令行工具输入命令:react-native init ZXJNetDemo 3》将下载的文件中的.js 文件 放到刚生成项目的...