Hibernate 主键

avatar 2017年07月25日18:03:27 1 2573 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此
我们的学生类有 五个字段
  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

  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0