hibernate的ID生成策略
2016-05-20 00:58
369 查看
package org.com.test.test; import org.com.test.model.Book; import org.com.test.util.HibernateUtil; import org.hibernate.Session; import org.junit.Test; public class TestIDgen { @Test public void testAssign(){ Session session = null; try { session = HibernateUtil.getSession(); session.beginTransaction(); Book b = new Book(); b.setName("Think In Java"); b.setPrice(12.2); session.save(b); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtil.closeSession(session); } /** * 第一次执行没有问题,因为第一次执行的时候默认使用Id为0 ,当第二次执行的时候,就报错了。以为继续使用默认的Id=0,所以报错。 * 因为没有设置ID。因为在 Book.hbm.xml中设置了assigned;<generator class="assigned"/>所以抛这个异常 * 因为设置了assigned(赋值[分配];)之后就,就需要手动设置ID了。 * Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY' */ } @Test public void testAssign1(){ Session session = null; try { session = HibernateUtil.getSession(); session.beginTransaction(); Book b = new Book(); b.setName("Think In Java"); b.setPrice(12.2); // b.setId(1); //手动设置id session.save(b); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtil.closeSession(session); } /** *手动设置ID之后就没有报错了。 */ } /** * 上面建立的表,需要删除掉,否者会报错。 */ @Test public void testUUid(){ /** * 使用uuid会在id列中自动生成一个字符串,不会重复,所以执行多少次都不会报错。 * 但是最佳实践是使用native;因为实际开发中,查询比更新操作频率多。而字符串相对于数字更难检索到。 * 虽然插入的时候,uuid会自动生成字符串,可以提高插入速度。但是插入的频率远比查询的频率少。 */ Session session = null; try { session = HibernateUtil.getSession(); session.beginTransaction(); Book b = new Book(); b.setName("Think In Java"); b.setPrice(12.2); session.save(b); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtil.closeSession(session); } } }
package org.com.test.model; public class Book { //private int id; private String id; private String name; private double price; /*public int getId() { return id; } public void setId(int id) { this.id = id; }*/ public String getName() { return name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.com.test.model"> <class name="Book" table="t_book"> <id name="id"> <!-- <generator class="assigned"/> --><!-- 这个需要开发人员自己定义id --> <generator class="uuid"/> <!-- 会自动生成一个字符串,此时主键必须为字符串 --> </id> <property name="name"/> <property name="price"/> </class> </hibernate-mapping>
相关文章推荐
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- Struts2+Hibernate实现数据分页的方法
- Hibernate环境搭建与配置方法(Hello world配置文件版)
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- 详解Java的Hibernate框架中的注解与缓存
- 浅析Java的Hibernate框架中的继承关系设计
- Hibernate实现批量添加数据的方法
- JQuery+Ajax+Struts2+Hibernate框架整合实现完整的登录注册
- 深入理解Hibernate中的flush机制
- 简要分析Java的Hibernate框架中的自定义类型
- 简单的手工hibernate程序示例