package org.easyframe.enterprise.spring; import java.sql.SQLException; import java.util.UUID; import javax.persistence.PersistenceException; import jef.database.DbClient; import jef.database.IQueryableEntity; import jef.database.Sequence; import jef.database.dialect.DatabaseDialect; import jef.database.dialect.type.AutoIncrementMapping; import jef.database.jpa.JefEntityManagerFactory; import jef.database.meta.ITableMetadata; import jef.database.meta.MetaHolder; import jef.tools.Assert; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; public class UniqueIdManagerImpl implements UniqueIdManager,InitializingBean{ private JefEntityManagerFactory entityManagerFactory; /** * {@inheritDoc}<br> * 若序列不存在会自动创建,且序列起始值=配置项AUTO_SEQUENCE_START的值,<br> * 若未配置则序列起始值=表中当前最大序列值+1. */ public long nextLong(ITableMetadata meta) { try{ return getNextLong(meta); }catch(SQLException e){ throw new PersistenceException(e.getMessage()+" "+e.getSQLState(),e); } } /** * {@inheritDoc}<br> * 若序列不存在会自动创建,且序列起始值=配置项AUTO_SEQUENCE_START的值,<br> * 若未配置则序列起始值=表中当前最大序列值+1. */ public long nextLong(Class<? extends IQueryableEntity> clz) { ITableMetadata meta=MetaHolder.getMeta(clz); try{ return getNextLong(meta); }catch(SQLException e){ throw new PersistenceException(e.getMessage()+" "+e.getSQLState(),e); } } public long nextLong() { try { Sequence holder=getDbClient().getSqlTemplate(null).getSequence("DEFAULT_GLOBAL_SEQ",12); return holder.next(); } catch (SQLException e) { throw new PersistenceException(e.getMessage()+" "+e.getSQLState(),e); } } public String nextGUID() { return UUID.randomUUID().toString(); } /* * */ public long nextLong(String dbKey,String seqName) { try{ Sequence holder=getDbClient().getSqlTemplate(dbKey).getSequence(seqName,12); return holder.next(); }catch(SQLException e){ throw new RuntimeException(e); } } /** * {@inheritDoc}<br> * 若序列不存在会自动创建,且序列起始值=配置项AUTO_SEQUENCE_START的值,<br> * 若未配置则序列起始值={@link SequenceKeyHolder#DEFAULT_SEQ_START}. */ public long nextLong(String seqName) { return nextLong(null,seqName); } public void afterPropertiesSet() throws Exception { Assert.notNull(entityManagerFactory,"The dbclient was not set!!"); } @Autowired public void setEntityManagerFactory(JefEntityManagerFactory entityManagerFactory) { this.entityManagerFactory = entityManagerFactory; } private long getNextLong(ITableMetadata meta) throws SQLException { AutoIncrementMapping mapping=meta.getFirstAutoincrementDef(); DbClient client=getDbClient(); DatabaseDialect profile=client.getProfile(null); Sequence holder = client.getSqlTemplate(mapping.getSequenceDataSource(profile)).getSequence(meta.getFirstAutoincrementDef()); return holder.next(); } private DbClient getDbClient() { DbClient dbClient = entityManagerFactory.getDefault(); return dbClient; } }