Hibernate 主键

我们的学生类有 五个字段
  1. private int sid;//学号
  2. private String name;//姓名
  3. private int sex;//性别
  4. private Date birthday;//出生日期
  5. private String address;//地址
我们还写了一个 带参的构造方法,用来给数据库添加数据
  1. public Student(int sid, String name, int sex, Date birthday, String address) {
  2.         this.sid = sid;
  3.         this.name = name;
  4.         this.sex = sex;
  5.         this.birthday = birthday;
  6.         this.address = address;
  7.  }
对了,hibernate.cfg.xml 里设置的 数据表生成策略是 update,不要用 create
  1. <property name="hbm2ddl.auto">update</property>
主键的赋值方法有两种,如下

1、手工赋值 assigned

Student.hbm.xml 的部分代码如下,主键策略是 assigned
  1. <id name="sid" type="int">
  2.         <column name="SID" />
  3.         <generator class="assigned" />
  4. </id>
在测试类里,我们在 testSaveStudents 方法内只需要写
  1. Student s = new Student(1,"苏轼",1,new Date(),"四川");
  2. session.save(s);//保存对象进入数据库
但是,因为这是手工赋值,所有 sid(主键)必须每次都要赋值,如果我们不赋值,像这样
  1. Student s = new Student();
  2. s.setName("陶渊明");
  3. s.setSex(1);
  4. s.setBirthday(new Date());
  5. s.setAddress("江西");
  6. session.save(s);//保存对象进入数据库
查看数据库,发现 陶渊明 这条记录的 sid=0,为什么是 0,因为 int 类型的初始值为 0 如果我们继续添加一条,不设置 sid 话,就会报错,因为主键已存在(还是 0) 同时,我们查看数据表的结构,很容易发现,主键是没有设置为 自动递增的  

2、主键自动生成 native

Student.hbm.xml 的部分代码如下,主键策略是 assigned
  1. <id name="sid" type="int">
  2.         <column name="SID" />
  3.         <generator class="native" />
  4. </id>
我们还是用刚才 陶渊明的 例子。为了查看更清晰,先把原来的数据表删除掉
  1. Student s = new Student();
  2. s.setName("陶渊明");
  3. s.setSex(1);
  4. s.setBirthday(new Date());
  5. s.setAddress("江西");
  6. session.save(s);//保存对象进入数据库
为了说明情况,我们连续运行 三次 ,再查看数据库 可见,sid 是 从 1 开始,递增的。查看数据表结构,可以证明 补充一下:如果用 native 主键自动递增的话,手动设置 sid (如 s.setSid(100);)是不会生效的,也不会报错。   本文链接:https://liuyanzhao.com/5385.html  

发表评论

目前评论:2