• 那是从何处传来的钟声呢?偶尔听到那钟声,平添一份喜悦与向往之情。

Hibernate 主键

后端 Nanait 12年前 (2012-10-21) 815次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

我们的学生类有 五个字段

  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

Hibernate 主键

如果我们继续添加一条,不设置 sid 话,就会报错,因为主键已存在(还是 0)

同时,我们查看数据表的结构,很容易发现,主键是没有设置为 自动递增的

Hibernate 主键

 

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);//保存对象进入数据库

为了说明情况,我们连续运行 三次 ,再查看数据库

Hibernate 主键

可见,sid 是 从 1 开始,递增的。查看数据表结构,可以证明

Hibernate 主键

补充一下:如果用 native 主键自动递增的话,手动设置 sid (如 s.setSid(100);)是不会生效的,也不会报错。


何处钟 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Hibernate 主键
喜欢 (0)
[15211539367@163.com]
分享 (0)

您必须 登录 才能发表评论!