在学习使用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]
。。。望各位大侠指教个中原因,谢谢。