Hibernate4从入门到精通五——————ID生成策略


一、使用assigned

拷贝上一个项目

1、在org.zttc.itat.model包下新建POJO类

Book.java

package org.zttc.itat.model;

public class Book {
	
	private int 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 void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
}

2、 org.zttc.itat.model包下新建

Book.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">

<hibernate-mapping package="org.zttc.itat.model">
    <class name="Book" table="t_book">
        <id name="id">
        <!-- assigned表示不会自动生成,而是需要由用户来指定 -->
          	<generator class="assigned"/>
        </id>
        <property name="name"/>
        <property name="price"/>
    </class>
</hibernate-mapping>

3、在包org.zttc.itat.test下新建Junit测试类

TestIDGen.java

package org.zttc.itat.test;

import org.hibernate.Session;
import org.junit.Test;
import org.zttc.itat.model.Book;
import org.zttc.itat.util.HibernateUtil;

public class TestIDGen {

	@Test
	public void testAssign() {
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			Book b = new Book();
			b.setName("Thinking in java");
			b.setPrice(12.2);
			session.save(b);
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtil.close(session);
		}
	}
}


运行testAssign方法,在itat_hibernate数据库中会新建一个表t_book:

id            name                      price

0        Thinking in java        12.2


为什么id为0呢,因为在Book.hbm.xml中配置的<generator class="assigned"/>,

assigned表示不会自动生成,而是需要由开发人员来指定,而用户没指定,所以为0.


4、再次运行testAssign方法,会抛出异常。

                              Duplicate entry '0' for key 'PRIMARY'       

      重复的id。

二、使用uuid

1、改动Book.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">

<hibernate-mapping package="org.zttc.itat.model">
    <class name="Book" table="t_book">
        <id name="id">
         <!-- uuid会自动生成一个字符串,此时组件必须为String类型 -->
          	<generator class="uuid"/>
        </id>
        <property name="name"/>
        <property name="price"/>
    </class>
</hibernate-mapping>

2、使用uuid的时候主键要为String类型,所以改变Book.java

package org.zttc.itat.model;

public class Book {
	
	private String id;
	private String name;
	private double price;

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
}

3、运行测试类的testAssign()方法。

数据库得到如下



4、再次运行测试类的testAssign()方法,不会报错,得到如下




三、总结

1、在xx.hbm.xml中使用<generator class="native"/>表示主键由hibernate自动生成。

uuid自动生成字符串

assigned表示由开发者指定id

2、uuid是系统产生的,insert数据库时相比native要快很多,

但是uuid是一长串无序字符串,理论上讲查找起来会慢一点,但是不太会影响开发的。


而native是数据库生成,在insert时会先查询数据库计算id的最大值,所以会比uuid慢一点,

但是在查找和删除数据时,会比较方便。


3、实际项目中insert比较少,查询比较多,所以一般用native,很少用uuid。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值