您的位置:首页 > 其它

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