1. hibernate的主键生成策略
generator元素:表示了一个主键生成器,
每个主键都必须定义相应的主键生成策略。
它用来为持久化类实例生成唯一的标识 。
1.1 程序员自己控制:assigned
数据类型不限、保存前必须赋值
代码案例:
student实体类:
package com.liuyongqi.MavenHibernateDemo2.entity;
import java.io.Serializable;
/**
* 学生实体类
* @author Administrator
* @data 2018年8月1日
* @time 下午4:14:01
*/
public class Student implements Serializable {
/**
*
*/
private static final long serialVersionUID = 3370646435815237259L;
private Integer sid;
private String sname;
public Student(Integer sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + "]";
}
}
Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-8-1 16:17:17 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.liuyongqi.MavenHibernateDemo2.entity.Student" table="tb_student">
<id name="sid" type="java.lang.Integer">
<column name="SID" />
<!-- 它用来为持久化类实例生成唯一的标识 。 -->
<!-- assigned: 数据类型不限、保存前必须赋值-->
<!--increment:数字,无需赋值 -->
<!--identity(重点掌握) 数字,无需赋值 -->
<!--native(重点掌握),等于identity+sequence -->
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
</class>
</hibernate-mapping>
StudentDao类:
package com.liuyongqi.MavenHibernateDemo2.dao;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liuyongqi.MavenHibernateDemo2.entity.Student;
import com.liuyongqi.MavenHibernateDemo2.util.SessionFactoryUtil;
/**
* 学生实体类doa方法
* @author Administrator
* @data 2018年8月1日
* @time 下午4:29:29
*/
public class StudentDao {
public void addStudent(Student student) {
Session session = SessionFactoryUtil.openSession();
Transaction transaction = session.beginTransaction();
Serializable sid = session.save(student);
System.out.println(sid);
transaction.commit();
SessionFactoryUtil.closeSession();
}
}
测试类:
package com.liuyongqi.MavenHibernateDemo2.test;
import com.liuyongqi.MavenHibernateDemo2.dao.StudentDao;
import com.liuyongqi.MavenHibernateDemo2.entity.Student;
/**
* 测试类
* @author Administrator
* @data 2018年8月1日
* @time 下午4:34:36
*/
public class Test1 {
public static void main(String[] args) {
StudentDao studentDao=new StudentDao();
Student student=new Student();
student.setSid(1);
student.setSname("刘永麒");
studentDao.addStudent(student);
}
}
运行结果:
有可能出现的错误:
在调用save()之前,必须手动分配该类的id;意思是说id的值为空
解决方法:必须为所有属性赋值
1.2 hibernate控制:increment uuid/uuid.hex
1.2.1increment(重点掌握)
数字,无需赋值
代码案例:
实体类同上
StudentDao类:同上
Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-8-1 16:17:17 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.liuyongqi.MavenHibernateDemo2.entity.Student" table="tb_student">
<id name="sid" type="java.lang.Integer">
<column name="SID" />
<!-- 它用来为持久化类实例生成唯一的标识 。 -->
<!-- assigned: 数据类型不限、保存前必须赋值-->
<!--increment:数字,无需赋值 -->
<!--identity(重点掌握) 数字,无需赋值 -->
<!--native(重点掌握),等于identity+sequence -->
<generator class="increment" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
</class>
</hibernate-mapping>
测试类:
package com.liuyongqi.MavenHibernateDemo2.test;
import com.liuyongqi.MavenHibernateDemo2.dao.StudentDao;
import com.liuyongqi.MavenHibernateDemo2.entity.Student;
/**
* 测试类
* @author Administrator
* @data 2018年8月1日
* @time 下午4:34:36
*/
public class Test1 {
public static void main(String[] args) {
StudentDao studentDao=new StudentDao();
Student student=new Student();
//student.setSid(1);
student.setSname("何洋");
studentDao.addStudent(student);
}
}
运行前的结果:
运行后的结果:
1.2.2uuid/uuid.hex
(是由容器自动生成的一个32位的字符串,.hex代表的是十六进制) 32位的字符串,无需赋值,
代码案例:
工人实体类doa方法:
package com.liuyongqi.MavenHibernateDemo2.dao;
import java.io.Serializable;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.liuyongqi.MavenHibernateDemo2.entity.Student;
import com.liuyongqi.MavenHibernateDemo2.entity.Worker;
import com.liuyongqi.MavenHibernateDemo2.util.SessionFactoryUtil;
/**
* 工人实体类doa方法
* @author Administrator
* @data 2018年8月1日
* @time 下午4:29:29
*/
public class WorkerDao {
public void addWorker(Worker worker) {
Session session = SessionFactoryUtil.openSession();
Transaction transaction = session.beginTransaction();
Serializable wid = session.save(worker);
System.out.println(wid);
transaction.commit();
SessionFactoryUtil.closeSession();
}
}
工人实体类:
package com.liuyongqi.MavenHibernateDemo2.entity;
import java.io.Serializable;
/**
* worker工人实体类
* @author Administrator
* @data 2018年8月1日
* @time 下午4:17:34
*/
public class Worker implements Serializable{
/**
*
*/
private static final long serialVersionUID = -1110648352223617488L;
private String wid;
private String wname;
public Worker() {
super();
// TODO Auto-generated constructor stub
}
public Worker(String wid, String wname) {
super();
this.wid = wid;
this.wname = wname;
}
public String getWid() {
return wid;
}
public void setWid(String wid) {
this.wid = wid;
}
public String getWname() {
return wname;
}
public void setWname(String wname) {
this.wname = wname;
}
@Override
public String toString() {
return "Worker [wid=" + wid + ", wname=" + wname + "]";
}
}
Worker.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-8-1 16:22:52 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.liuyongqi.MavenHibernateDemo2.entity.Worker" table="t_worker">
<id name="wid" type="java.lang.String">
<column name="WID" />
<!--uuid: 是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)
32位的字符串,无需赋值, -->
<generator class="uuid" />
</id>
<property name="wname" type="java.lang.String">
<column name="WNAME" />
</property>
</class>
</hibernate-mapping>
测试类:
package com.liuyongqi.MavenHibernateDemo2.test;
import com.liuyongqi.MavenHibernateDemo2.dao.WorkerDao;
import com.liuyongqi.MavenHibernateDemo2.entity.Worker;
/**
* 测试类
* @author Administrator
* @data 2018年8月1日
* @time 下午4:34:36
*/
public class Test2 {
public static void main(String[] args) {
WorkerDao workerDao = new WorkerDao();
Worker worker = new Worker();
worker.setWid("bbbbbb");
worker.setWname("工人s上的巨大损失的就是");
workerDao.addWorker(worker);
}
}
运行的结果:
所有的hibernate.cfg.xml都一样:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db_a?useUnicode=true&characterEncoding=UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 显示sql语句 -->
<property name="show_sql" >true</property>
<!-- 格式化sql语句 -->
<property name="format_sql" >true</property>
<mapping resource="com/liuyongqi/MavenHibernateDemo2/entity/News.hbm.xml"/>
<mapping resource="com/liuyongqi/MavenHibernateDemo2/entity/Student.hbm.xml"/>
<!-- <mapping resource="com/liuyongqi/MavenHibernateDemo2/entity/Student2.hbm.xml"/> -->
<mapping resource="com/liuyongqi/MavenHibernateDemo2/entity/Worker.hbm.xml"/>
</session-factory>
</hibernate-configuration>
如果期待我的下一篇文章,请留言?