Nuz Dao Fetch

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

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值