`
Ivan0513
  • 浏览: 212586 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Nuz Dao Fetch

    博客分类:
  • Nutz
阅读更多

在学习使用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]

 。。。望各位大侠指教个中原因,谢谢。

 

 

分享到:
评论

相关推荐

    javascript实现fetch请求返回的统一拦截

    然而,fetch默认并不提供请求和响应的拦截器,这对于需要进行全局处理,比如鉴权、错误处理等场景并不方便。本篇文章主要探讨如何使用JavaScript实现fetch请求返回的统一拦截。 首先,我们需要理解拦截器的目的。...

    electron-main-fetch在Electron的主要进程中使用浏览器FetchAPI

    `electron-main-fetch`库就是为了满足这个需求而诞生的,它允许我们在Electron的主要进程中使用与浏览器相同的Fetch API。 Fetch API是一种现代、统一的接口,用于在Web上发起HTTP请求。它提供了异步操作,返回...

    JavaScript 用fetch 实现异步下载文件功能

    本文将详细解析如何使用JavaScript中的fetch API来实现文件的异步下载功能。首先,我们会介绍fetch API的基本用法,然后通过一个具体的实例代码来演示如何结合HTML和JavaScript来完成这一任务。 fetch API是现代...

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

    Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据 Oracle 中的游标数据读取是数据库开发中非常常见的操作。通常,我们使用 fetch some_cursor into var1, var2 形式来获取游标数据,当游标中的记录数...

    Fetch+Promise教程

    Fetch+Promise教程 Fetch API 是一种现代化的网络请求方式,旨在取代传统的 XMLHttpRequest。它提供了许多优点,包括链式调用的语法、返回 Promise 等。Fetch API 的概念和用法、Headers 对象、Request 对象等都是...

    西门子 TCP通信中的Fetch和Write用法

    西门子PLC中的TCP通信主要包括FETCH和WRITE两种通信方式,这两种方式无需在PLC侧编程,只需要进行一些简单的配置即可实现与S5设备或PC的数据交换。 首先,我们需要使用带有FETCHWRITE功能的模块。在进行硬件组态后...

    Laravel开发-fetch

    在Laravel框架中,"fetch"一词常常与数据查询关联,特别是在数据库操作时使用Eloquent ORM(对象关系映射)进行数据检索。本项目可能是一个关于如何在Laravel环境中利用fetch方法处理数据的示例或者教程。让我们深入...

    Hibernate Fetch 的作用

    在深入探讨Hibernate Fetch的作用之前,我们首先需要理解Hibernate框架本身以及其在持久化领域的重要性。Hibernate是一个开源的对象关系映射(ORM)框架,用于Java应用,它提供了将数据库记录映射到对象的方法,使得...

    FetchRobotics_FetchRobot_Fetch!_

    Fetch Robot

    OracleFetch

    《OracleFetch:Autonomy下的数据聚合与管理》 在当今数据驱动的世界中,高效的数据管理和检索成为了企业运营的关键。Autonomy公司推出的OracleFetch,作为一款专业的企业级数据聚合工具,为用户提供了强大的数据库...

    Node.js-d3-fetch这个模块提供基于Fetch之上的便捷解析

    **Node.js-d3-fetch模块详解** 在现代Web开发中,数据获取和处理是至关重要的环节。`d3-fetch`是一个非常实用的Node.js模块,它为开发者提供了基于Fetch API的便利扩展,使得在Node.js环境中处理HTTP请求变得更加...

    fetch请求超时

    fetch请求超时,在fetch的基础上做的可以设置超时时间的 javascript 插件,具体使用请查看我的博客 https://blog.csdn.net/yumikobu/article/details/80167982

    Fetch一个PHP的IMAP库

    【压缩包子文件的文件名称列表】"tedious-Fetch-ea3f1bb"看起来像是Fetch库的一个版本号或分支名。"tedious"可能表示这个版本在开发过程中可能是较为繁琐或复杂的,"ea3f1bb"很可能是Git仓库中的一个提交哈希,用于...

    Background Fetch 修正Demo

    在iOS开发中,Background Fetch是一项重要的特性,它允许应用程序在后台执行特定的任务,即使用户并未直接与应用交互。这项技术极大地提升了用户体验,因为应用可以及时更新内容,如新闻、邮件或者社交媒体通知,而...

    fetch检索策略

    在IT行业中,`fetch`检索策略是一个非常关键的概念,特别是在数据库查询优化以及Web应用性能提升方面。本篇文章将深入探讨`fetch`检索策略的核心概念、作用以及如何在实际开发中应用这一策略。 `fetch`检索策略是...

    前端项目-fetch.zip

    前端项目-fetch,fetch是window.fetch的javascript polyfill。全局fetch函数是web请求和处理响应的简单方式,不使用xmlhttprequest。这个polyfill编写的接近标准的fetch规范。

    Node.js-node-fetch一个轻量级的模块将window.fetch带至node.js和io.js

    标题中的“Node.js-node-fetch”指的是Node.js的一个第三方模块,名为`node-fetch`。这个模块的主要功能是将浏览器环境中的`window.fetch`API引入到Node.js和io.js环境中,使得在服务端也能方便地进行HTTP请求操作。...

    JavaScript - Fetch实现短信验证码注册登录完整示例:JavaScript - Fetch.js和附件说明

    JavaScript中的Fetch API是一种现代的、基于Promise的网络请求方法,用于替代传统的XMLHttpRequest。这个示例将详细讲解如何使用Fetch API来实现短信验证码的注册和登录功能,这在Web开发中是一个常见的用户验证机制...

    fetch-california-housing()数据集

    `fetch_california_housing()`是Scikit-Learn(sklearn)库中的一个内置函数,用于获取加利福尼亚州住房数据集。这个数据集包含了加利福尼亚州不同区域的住房价格信息,常用于教学和演示机器学习算法,特别是回归...

    react native fetch demo

    react native 使用 fetch 进行网络请求,fetch 的封装以及调用实例 (fetch demo) 1》下载该文件 2》使用命令行工具输入命令:react-native init ZXJNetDemo 3》将下载的文件中的.js 文件 放到刚生成项目的...

Global site tag (gtag.js) - Google Analytics