hibernate的主键生成策略

30 篇文章 0 订阅
30 篇文章 0 订阅

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&amp;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>

如果期待我的下一篇文章,请留言? 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银色亡灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值