社区
Java EE
帖子详情
求解:Hibernate主键自增
LvElvis
2011-01-07 09:11:02
各位大虾好,小弟在这里向你们请教一个关于Hibernate主键自增的问题,情况是这样子的:
该主键在数据库中的类型是char(4),我想让它用这种格式自增0001,0002...0010...9999。
请问有没有什么主键模式可以实现呢?或者有什么比较好的解决方法,请你们帮小弟提供些解决方案。谢谢!
...全文
545
26
打赏
收藏
求解:Hibernate主键自增
各位大虾好,小弟在这里向你们请教一个关于Hibernate主键自增的问题,情况是这样子的: 该主键在数据库中的类型是char(4),我想让它用这种格式自增0001,0002...0010...9999。 请问有没有什么主键模式可以实现呢?或者有什么比较好的解决方法,请你们帮小弟提供些解决方案。谢谢!
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
自增格式就那样,你不喜欢就自己插入主键好了。
火龙果被占用了
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)
hibernate
的
主键
问题
1 assigned:
主键
由外部程序负责生成,无需
Hibernate
参与。2 increment:对 long , short 或 int 的数据列生成自动增长
主键
。increment
主键
生成方式的特点是与底层数据库无关性,大部分数据库如 Mysql,MSSQL 和...
ssh插入mysql 数据
主键
值无法自动增长_MySQL数据库表
主键
设为
自增
,用
Hibernate
插入一条数据发现这条数据
主键
为0,再保存出错(值依然为0),
求解
...
我写的这个项目是SSH框架整合刚开始写,所以内容不多,不会占用各位大神太多时间MySQL数据库有两张表,Baoxiaodan(报销单)表和...
Hibernate
实体类和
Hibernate
映射文件数据库手写生成代码报销单CREATETABLEBiaoxiaod...
ssh oracle id native,Oracle ID
自增
实现Oracle Id
自增
1、方法一(Oracle Version Oracle 12c版本支持)create table app_student(id integer generated by default as identitynot null primary key,createtime DATE not NULL);insert into app_student...
MySQL
重启数据库服务后 -- InnoDB :
自增
列从初始值重新开始 (因为是存储在内存中,断电即失) -- MyISAM :
自增
列依然从上一个
自增
数据基础上开始 (存在文件中,不会丢失) 4.DQL查询数据 1.DQL语言 SELECT语法 SELECT [ALL ...
1-11
=============================================================================================== for(:){ String str="asdga"; ...for(char s:str){ //char 指的是str的元素的类型 ...int
Java EE
67,550
社区成员
225,863
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章