接上回繼續,TMP_EMP中的ID是根據序列SQ_TMP_EMP來生成的,需要在TmpEmp.hbm.xml中設置:
<id name="id" type="long">
<column name="ID" not-null="true" sql-type="NUMBER" unique="true"/>
<generator class="sequence">
<param name="sequence">SQ_TMP_EMP</param>
</generator>
</id>
這樣運行時,Hibernate就會自動從SQ_TMP_EMP中取nextval用來填充到ID字段中
示例代碼:
先創建一個工具類
package app;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private HibernateUtils(){
}
static SessionFactory sessionFactory;
/*
* 取得Hibernate的Session
*/
public static Session getSession(){
if (sessionFactory == null) {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
return sessionFactory.openSession();
}
/*
* insert記錄
*/
public static boolean addObject(Object obj){
Session ss = null;
Transaction ts = null;
boolean result = false;
try
{
ss = getSession();
ts = ss.beginTransaction();
ss.save(obj);
ts.commit();
result = true;
}
finally{
ss.close();
}
return result;
}
}
添加記錄的類
package app;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import domain.TmpEmp;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Hello {
/**
* @param args
*/
public static void main(String[] args) {
TmpEmp emp = new TmpEmp();
emp.setName("張三峰");
emp.setSalary(new BigDecimal(1000));
emp.setSex('M');
emp.setBirthday(new Date(1985-1900,12-1,1));//1985-12-1號
boolean b = HibernateUtils.addObject(emp);
if (b){
System.out.println("插入成功,新記錄的ID是:" + emp.getId());
}
else{
System.out.println("插入失敗!");
}
}
}
運行結果:
Hibernate: select IGSA.SQ_TMP_EMP.nextval from dual
Hibernate: insert into IGSA.TMP_EMP (NAME, BIRTHDAY, SEX, SALARY, ID) values (?, ?, ?, ?, ?)
插入成功,新記錄的ID是:210
當然,除用.hbm.xml來配置外,等效的注解方式,可以參考下面的寫法:
1 @Id 2 @SequenceGenerator(name="bkdex_seq_generator",sequenceName="SQ_BKD_EX") 3 @GeneratedValue(generator="bkdex_seq_generator",strategy=GenerationType.SEQUENCE) 4 @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0) 5 public BigDecimal getId() { 6 return this.id; 7 }
基本上這樣就行了,但是實際運行會發現sequence每次並不是加1,而是一個其它的數,如果想要每次加1,參考下面這樣:
1 @Id 2 @SequenceGenerator(name = "SEQ_ORDER", sequenceName = "SEQ_ORDER", allocationSize = 1) 3 @GeneratedValue(generator = "SEQ_ORDER", strategy = GenerationType.SEQUENCE) 4 @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0) 5 public BigDecimal getId() { 6 return this.id; 7 }
allocationSize=1 這個是關鍵
