求解:Hibernate主键自增

LvElvis 2011-01-07 09:11:02
各位大虾好,小弟在这里向你们请教一个关于Hibernate主键自增的问题,情况是这样子的:
该主键在数据库中的类型是char(4),我想让它用这种格式自增0001,0002...0010...9999。
请问有没有什么主键模式可以实现呢?或者有什么比较好的解决方法,请你们帮小弟提供些解决方案。谢谢!
...全文
545 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
mopishv0 2011-01-08
  • 打赏
  • 举报
回复
LZ在数据库里加个序列和触发器吧
qkniit 2011-01-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 lvelvis 的回复:]
各位大虾好,小弟在这里向你们请教一个关于Hibernate主键自增的问题,情况是这样子的:
该主键在数据库中的类型是char(4),我想让它用这种格式自增0001,0002...0010...9999。
请问有没有什么主键模式可以实现呢?或者有什么比较好的解决方法,请你们帮小弟提供些解决方案。谢谢!
[/Quote]

没有这样的主键模式,得自己写一个主键生成的方法,
一般主键不在页面显示的,
楼主你可以再建一个新的字段,来放0001,0002...0010...9999。
waitdream 2011-01-08
  • 打赏
  • 举报
回复
主键保持唯一即可,如果是纯数字,一般维护你肯定是要在界面上显示,
你不可能直接在数据库中直接操作,所以你可以设置成普通的自增长,
到时候在界面上取的时候Format即可,如果非要是这种数字格式,
那就在存入的时候就进行格式化。
LvElvis 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 javamylovett 的回复:]

我以前写了一个 发你参考下,首先先创建一张简单的表,插入一条数据
/*序列号表*/
create table order_seq(
seq int
);
insert into order_seq values(0);

然后创建一个类继承 TableGenerator 代码如下 注意导包
import org.hibernate.id.TableGenerator; 以前搞了……
[/Quote]

这种方法当使用批量添加的时候会出现问题,请问这怎么解决呢
大蚂虾 2011-01-07
  • 打赏
  • 举报
回复
主键为啥要用char型呢??

2楼的方法很危险,100%会出现主键重复

我推荐用触发器!~~
玄玉 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zn85600301 的回复:]
引用 5 楼 bao110908 的回复:

主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!

主键就是个标示位 不要让他操太多的心
[/Quote]


支持这种说法!!!
tt986101dpc 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]

主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!
[/Quote]

+1 说的非常好。。赞一个
liuchao1989 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!
[/Quote]+1
Away_11111111 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!
[/Quote]
每次看到你回帖,都获益匪浅。
happyfmy 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!
[/Quote]
火龙果大大给力

要实现自己写方法生成id写入数据库
happyfmy 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bao110908 的回复:]
主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!
[/Quote]
火龙果大大给力

要实现自己写方法生成id写入数据库
qunhao 2011-01-07
  • 打赏
  • 举报
回复
自增格式就那样,你不喜欢就自己插入主键好了。
  • 打赏
  • 举报
回复
主键应与业务无关,也就是说只要保证唯一就可以了,并不需要管什么形式。

主键与业务密切相关是数据库设计的一大忌!
LvElvis 2011-01-07
  • 打赏
  • 举报
回复
非常感谢javamylovett 这或许就是我想要的东西,我试试效果怎么样。很感谢大家的意见
LvElvis 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zengzhongxiang 的回复:]
主键自增是这种形式 1,2,3.....
那可以写个方法
public String geNumber(){
//先到数据库里面查询最大的一条数据 select max(列) from 表面
//这里假设为 String max;
if(数据库里面没有){
return "0001";
}else{
long s1 = long.paseLong(max……
[/Quote]

这样会不会降低效率呢?还有一个就是,如果我是批量添加,那不就要查询很多次
jsut_yi 2011-01-07
  • 打赏
  • 举报
回复
这样貌似可以实现,等待别的方式实现。。
米土木木 2011-01-07
  • 打赏
  • 举报
回复
主键自增是这种形式 1,2,3.....
那可以写个方法
public String geNumber(){
//先到数据库里面查询最大的一条数据 select max(列) from 表面
//这里假设为 String max;
if(数据库里面没有){
return "0001";
}else{
long s1 = long.paseLong(max);
long s2 += s1;
return 然后根据S2返回的长度来确定前面加几个0;
}
amos1989 2011-01-07
  • 打赏
  • 举报
回复
javamylovett 2011-01-07
  • 打赏
  • 举报
回复
我以前写了一个 发你参考下,首先先创建一张简单的表,插入一条数据
/*序列号表*/
create table order_seq(
seq int
);
insert into order_seq values(0);

然后创建一个类继承 TableGenerator 代码如下 注意导包
import org.hibernate.id.TableGenerator; 以前搞了半天才发现包错了。

package com.accp.hibdemo.id.gener;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.TableGenerator;

public class MyIdGenerator extends TableGenerator{

@Override
public synchronized Serializable generate(SessionImplementor session,
Object object) throws HibernateException {
//取到序列号
Integer seq = (Integer)super.generate(session, object);
//组合成想要的格式
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String result = sdf.format(now);

if(seq<10){
result += "000"+seq;
}else if(seq < 100){
result += "00"+seq;
}else if(seq < 1000){
result += "0"+seq;
}else{
result += seq;
}

return result;
}

}

然后配置hibernate 注意我省略了一张User表,有id,name,pwd字段

<class name="com.accp.hibdemo.id.entity.Userinfo05" table="userinfo05" catalog="hib_02">
<id name="id" type="java.lang.String">
<column name="id" length="12" />
<!-- 自定义主键生成 -->
<generator class="com.accp.hibdemo.id.gener.MyIdGenerator">
<param name="table">order_seq</param>
<param name="column">seq</param>
</generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="30" not-null="true" unique="true" />
</property>
<property name="pwd" type="java.lang.String">
<column name="pwd" length="30" not-null="true" />
</property>
</class>
javamylovett 2011-01-07
  • 打赏
  • 举报
回复
可以自定义主键 生成类,然后在配置主键的时候指明主键生成类就可以了,可以做到你想要的任何主键样式,自己百度一下,google一下了。
加载更多回复(6)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧