hibernate 3 ID策略生成器自定义,可用于注释 - 规则: 九位业务编号 + 六位日期 + 六位自增长序列

简介: /***hibernate ID策略生成器 自定义 -  规则: 业务编号 + 日期 + 六位自增长序列*/public class MyKeyGenerator implements IdentifierGenerator, Configurable {    private static final Log log = LogFactory.
/**
*hibernate ID策略生成器 自定义 -  规则: 业务编号 + 日期 + 六位自增长序列
*/
public   class  MyKeyGenerator  implements  IdentifierGenerator, Configurable {

    
private   static   final  Log log  =  LogFactory.getLog(MyKeyGenerator. class );

    
private   long  next;

    
private  String sql;
    
private  String table;
    
private  String column;
    
private  String schema;

    
    
public   synchronized  Serializable generate(SessionImplementor session,
            Object object) 
throws  HibernateException {
        SimpleDateFormat f 
=   new  SimpleDateFormat( " yyMMdd " );
        String preDate 
=  f.format( new  Date());
        LogAction logaction 
=   new  LogAction();
        
//  String bh = logaction.getBh();
        String bh  =   " 123456789 " ;
        
return  bh  +  preDate  +  getNext(session, bh,table);

    }

    
public   void  configure(org.hibernate.type.Type type, Properties params,
            Dialect d) 
throws  MappingException {
        table 
=  params.getProperty( " table " );
        
if  (table  ==   null )
            table 
=  params.getProperty(PersistentIdentifierGenerator.TABLE);
        column 
=  params.getProperty( " column " );
        
if  (column  ==   null )
            column 
=  params.getProperty(PersistentIdentifierGenerator.PK);
        schema 
=  params.getProperty(PersistentIdentifierGenerator.SCHEMA);

    }
    
/**
     * 得到当前表ID的最后六位的最大数
     * 
     * 
@param  session
     * 
@param  jsbh
     * 
@return
     
*/
    
private  String getNext(SessionImplementor session, String bh,String table) {
        sql 
=   " select  max(substr( " + column + " ,16)) from  " + (schema  ==   null   ?  table : schema  +   ' . '   +  table) + "  where substr( " + column + " ,10,6) = to_char(sysdate,'yyMMdd') and substr( " + column + " ,0,9) = ' "   +  bh  +   " ' and  length( " + column + " )=21  " ;
        log.info(
" fetching initial value:  "   +  sql);
        
        
try  {
            PreparedStatement st 
=  session
                    .getBatcher()
                    .prepareSelectStatement(
                            sql);
            
try  {
                ResultSet rs 
=  st.executeQuery();
                
try  {
                    
if  (rs.next()) {
                        next 
=  rs.getLong( 1 +   1 ;
                        
if  (rs.wasNull())
                            next 
=   1 ;
                    } 
else  {
                        next 
=   1 ;
                    }
                    sql 
=   null ;
                    log.debug(
" first free id:  "   +  next);
                } 
finally  {
                    rs.close();
                }
            } 
finally  {
                session.getBatcher().closeStatement(st);
            }
            
return  toString( 6 , next);
        } 
catch  (SQLException sqle) {
            
throw  JDBCExceptionHelper.convert(session.getFactory()
                    .getSQLExceptionConverter(), sqle,
                    
" could not fetch initial value for increment generator " ,
                    sql);
        }
    }

    
/**
     * 格式化数字不足补齐
     * 
     * 
@param  num
     * 
@param  value
     * 
@return
     
*/
    
public   static  String toString( int  num,  long  value) {
        String result 
=  ( new  Long(value)).toString();
        
while  (num  >  result.length()) {
            result 
=   " 0 "   +  result;
        }
        
return  result;
    }

 

JAVA中注解使用方法:

 

 @Id @GeneratedValue(generator="custom-id")
 @GenericGenerator(name="custom-id", strategy = "javacommon.base.AwdKeyGenerator")
 @Column(name = "ID", unique = true, nullable = false, insertable = true, updatable = true, length = 21)
 public java.lang.String getId() {
  return this.id;
 }

相关文章
|
3月前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
93 5
|
4月前
|
缓存 Java 数据库连接
Hibernate 中的获取策略有哪些?
【8月更文挑战第21天】
23 0
|
5月前
|
SQL 缓存 Java
使用Hibernate实现复杂数据库查询优化策略
使用Hibernate实现复杂数据库查询优化策略
|
5月前
|
SQL 缓存 Java
使用Hibernate实现复杂数据库查询优化策略
使用Hibernate实现复杂数据库查询优化策略
|
6月前
|
缓存 Java 数据库连接
构建高效数据库交互:Hibernate与JPA的性能优化策略
【6月更文挑战第25天】在大数据时代,优化Hibernate和JPA的数据库性能至关重要。本文探讨了优化策略:正确配置映射以减少冗余,利用JPQL/HQL提升查询效率,避免全字段选择,使用索引和分页,有效利用缓存策略,以及管理事务以平衡资源锁定。示例代码展示了分页查询的实现,以防止性能下降。
128 0
|
7月前
|
Java 数据库连接 数据库
Hibernate5中实体映射命名策略
Hibernate5中实体映射命名策略
140 0
|
7月前
|
SQL 缓存 Java
Hibernate - 检索策略入门与详解
Hibernate - 检索策略入门与详解
59 0
|
Java 数据库连接
【hibernate validator】(六)创建自定义约束
【hibernate validator】(六)创建自定义约束
|
SQL Java 数据库连接
《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略
《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略
111 0
《Hibernate上课笔记》-----class8----Hibernate的检索方式和检索策略
|
Oracle 关系型数据库 Java
hibernate注解 映射序列到Oracle
hibernate注解 映射序列到Oracle