package cn.silvernet.util; import java.io.Serializable; import java.util.UUID; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.id.IdentifierGenerator; public class KeyUtils implements IdentifierGenerator { @Override public Serializable generate(SessionImplementor arg0, Object arg1) throws HibernateException { // TODO Auto-generated method stub return "--"+UUID.randomUUID();//返回自定义生成的主键 } }
测试:
public class AddTest { @Test public void addTest() { Info info=new Info(); info.setTitle("新"); DbCommon.save(info); } }
配置:
<class name="Info" table="t_info"> <id name="id" column="id"> <generator class="cn.silvernet.util.KeyUtils"/> </id> <property name="date" ></property> <property name="type" ></property> <property name="title" ></property> <property name="content" length="20000" ></property> </class>
来一个更为直接的例子:
职员的id变为公司id+两位自增id:
package cn.silvernet.util; import java.io.Serializable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Properties; import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.QueryParameters; import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.id.Configurable; import org.hibernate.id.IdentifierGenerator; import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.type.Type; import cn.silvernet.model.Trader; @SuppressWarnings({ "unused", "unchecked" }) public class KeyUtilsTrader implements IdentifierGenerator, Configurable { private static final int Digit = 2;// 主键位数 private String className;// 类名 private String tableName;// 表名 private String PK;// 主键名 private long minKey = 1;// 可用的最小主键 @Override public Serializable generate(SessionImplementor arg0, Object arg1) throws HibernateException { Trader trader = (Trader) arg1; // 组织HQL语句查询所有本公司的交易员主键 String hql = "select o." + this.PK + " from " + this.className + " o where o.company ='" + trader.getCompany().getId() + "'"; QueryParameters parameters = new QueryParameters(); List<String> list = arg0.list(hql, parameters);// 执行hql语句 List<Long> listLong = new ArrayList<Long>(); for (String s : list) { listLong.add(Long.valueOf(s.substring(trader.getCompany().getId() .length(), s.length())));// 除去公司id放入long数组 } // 对交易员表中的id进行排序 listLong.sort(new Comparator<Long>() { @Override public int compare(Long o1, Long o2) { // TODO Auto-generated method stub return (int) (o1 - o2);// 升序 } }); // 寻找可用的最小主键 for (int i = 1; i < (int) Math.pow(10, KeyUtilsTrader.Digit); i++) { if (i > listLong.size() || listLong.get(i - 1) != i) { this.minKey = i; break; } } return String.format("%s%0" + KeyUtilsTrader.Digit + "d", trader .getCompany().getId(), this.minKey);// 返回自定义生成的主键(公司id+交易员id) } @Override public void configure(Type arg0, Properties arg1, Dialect arg2) throws MappingException { this.className = arg1 .getProperty(PersistentIdentifierGenerator.JPA_ENTITY_NAME); this.tableName = arg1.getProperty(PersistentIdentifierGenerator.TABLE); this.PK = arg1.getProperty(PersistentIdentifierGenerator.PK); } }