我们的学生类有 五个字段
- private int sid;//学号
- private String name;//姓名
- private int sex;//性别
- private Date birthday;//出生日期
- private String address;//地址
我们还写了一个 带参的构造方法,用来给数据库添加数据
- public Student(int sid, String name, int sex, Date birthday, String address) {
- this.sid = sid;
- this.name = name;
- this.sex = sex;
- this.birthday = birthday;
- this.address = address;
- }
对了,hibernate.cfg.xml 里设置的 数据表生成策略是 update,不要用 create
- <property name=“hbm2ddl.auto”>update</property>
主键的赋值方法有两种,如下
1、手工赋值 assigned
Student.hbm.xml 的部分代码如下,主键策略是 assigned
- <id name=“sid” type=“int”>
- <column name=“SID” />
- <generator class=“assigned” />
- </id>
在测试类里,我们在 testSaveStudents 方法内只需要写
- Student s = new Student(1,“苏轼”,1,new Date(),“四川”);
- session.save(s);//保存对象进入数据库
但是,因为这是手工赋值,所有 sid(主键)必须每次都要赋值,如果我们不赋值,像这样
- Student s = new Student();
- s.setName(“陶渊明”);
- s.setSex(1);
- s.setBirthday(new Date());
- s.setAddress(“江西”);
- session.save(s);//保存对象进入数据库
查看数据库,发现 陶渊明 这条记录的 sid=0,为什么是 0,因为 int 类型的初始值为 0
如果我们继续添加一条,不设置 sid 话,就会报错,因为主键已存在(还是 0)
同时,我们查看数据表的结构,很容易发现,主键是没有设置为 自动递增的
2、主键自动生成 native
Student.hbm.xml 的部分代码如下,主键策略是 assigned
- <id name=“sid” type=“int”>
- <column name=“SID” />
- <generator class=“native” />
- </id>
我们还是用刚才 陶渊明的 例子。为了查看更清晰,先把原来的数据表删除掉
- Student s = new Student();
- s.setName(“陶渊明”);
- s.setSex(1);
- s.setBirthday(new Date());
- s.setAddress(“江西”);
- session.save(s);//保存对象进入数据库
为了说明情况,我们连续运行 三次 ,再查看数据库
可见,sid 是 从 1 开始,递增的。查看数据表结构,可以证明
补充一下:如果用 native 主键自动递增的话,手动设置 sid (如 s.setSid(100);)是不会生效的,也不会报错。