hibernate 有可以自定义主键的http://weishuwei.javaeye.com/blog/66009 看看这篇文章吧,兄弟...

解决方案 »

  1.   

    把主键生成方式设置为assigned,主键生成用程序来控制吧。
      

  2.   

    当日期改变后,后面的自增如0001-000X是如何归零,这点想了半天..
    单是生成U20071016(1-2-3-........) 这点到是写出来了.
    但当日期变成1017,又要初使化为U200710160001为这天第一个注册用户的ID,这里还没想出招来...
      

  3.   

    lz可以参考文章:http://dev.csdn.net/article/44/44775.shtm
    那里有主键生成器的 sql 代码 注释也很详细 创建表 tbrecno 
    create table tbrecno 
    (
    fRecord varchar(30) ,
    Predate datetime,
    Prenum   int,
    Word    varchar(4)
    )
    再 执行 http://dev.csdn.net/article/44/44775.shtm 这里的SQL版的主键生产器 的存储过程
    1.写个主键生成器 的存储过程
    2.主键生成方式设置为assigned
    3.用JDBC 调用存储过程 
              用 session.connection();获得Connection 对象
              之后就可以执行存储过程了
            如:存储过程名 getpkno  有两个参数 一个是 输入参数 第二个是返回参数
             如下调用         Session session = HibernateSessionFactory.currentSession();
            String pk=null;
            Connection conn = null;
            CallableStatement call = null;
            conn = session().connection();
            try {
    call = conn.prepareCall("{call getpkno(? ,?)}");
    call.setString(1, "Yp_ypxx");//设置输入参数
    call.registerOutParameter(2, java.sql.Types.VARCHAR);//注册输出参数
    call.execute();//执行
    pk= call.getString(2);//得到输出参数
    return pk;
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally{
    try {
    call.close();
    conn.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
            
         return pk;
       
     
      

  4.   

    自定义主键就是了 public class IdGenerator extends TableGenera{
    //这里写一下你的主键生成策略
    //按你的这个要求写很简单的,获得日期->转换成字符串,最后添加4位数字递增
    //每个主键生成都先检测一下已有的主键值,最后四位递增就可以了
    }然后配置你自定义的主键策略就是了
      

  5.   

    String id=你自己规则生成的主键
    session.save(object,id)
      

  6.   

    取主键前先查询是否存在 主键为0001的的记录
    如果有 则为currentKey+1
    没有 则为0001 把currentKey设置成0001