一、使用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。