NutzCN Logo
问答 实体类中,关于整数型的ID自增,怎么同时兼容sqlserver和oracle2种数据库?
发布于 2564天前 作者 qq_7fafbecc 2160 次浏览 复制 上一个帖子 下一个帖子
标签:
@Table("BLOOD_DATA_BAGINFO")
public class BagInfo {
	
	@Id
	@Column("ID")
    private long id;
	
	//血袋编号
	@Column("BAGCODE")
    private String bagCode;
	
	//来源代号
	@Column("SOURCE")
    private String source;

这个实体类的ID目前是针对SQLSERVER数据库的ID自增机制,如果要同时兼容ORACLE数据库的seq.nextval这种自增,要怎么修改这个类呢?

22 回复
@Id // 1.r.58之前的版本需要设置为false
@Prev(@SQL(value="select xxx_seq.nextval from dual", db=DB.ORACLE))
private int id; 

文档上ORACLE的是这样写的,但是这只是对ORACLE的,怎么同时兼容sqlserver和oracle呢

@Prev里面的@Sql是数组,可以声明多个,然后每个@Sql有自己的db设置.

不加@Prev也能自增哦,让nutz建表,会带上触发器

我这样写不行啊,格式不对。
因为sqlserver的id整数自增,是不用写代码的,直接向数据库写记录,这个字段就自己填充了下一个整数了。
所以要不要写个null进去?又报错

	@Id
	@Column("ID")
	@Prev(@SQL(value="select xxx_seq.nextval from dual", db=DB.ORACLE),
			   value=null, db=DB.SQLSERVER)
	private long id;

自增就不用加@Sql啊,你用的是什么版本?换最新版啦

不加@Sql,怎么同时兼容oracle和sqlserver的整数自增?

删掉@Prev,然后让nutz建表或者加触发器

nutz建表不考虑,领导说要有自己独立的建库脚本

就只剩下触发器一条路了吗?触发器怎么弄啊?

那就自己加触发器得了

可是,我的sqlserver的自增不需要触发器,你的意思是oracle自增需要触发器?

可是这段代码又怎么写呢,怎么把一个不触发,一个触发,写进去呢?

@Id
@Column("ID")
private long id;

在oracle建好触发器之后,就跟mysql自增一模一样了,不需要@Prev.

@Id
@Column("ID")
private long id;

你的意思是:上面这段代码不用变,oracle中建好序列,以及触发器,用这个触发器把seq.nextval写入表的id中?

写个testcase,看看nutz怎么建表嘛

    @Id
    @Prev({
        @SQL(db = DB.ORACLE, value="SELECT seq_userid.nextval FROM dual")
    })
    @Column("USERID")
    private long userid;

写了一个测试项目,尝试在sqlserver和oracle中切换了一下,
nutz好像知道我这个项目连接的是oracle还是sqlserver,

当连接oracle时,就取序列,
当连接sqlserver时,就不管,由sqlserver引擎来插入下一个int值?

那么,如果还要加一个MySql怎么写呢?
我是指下面的格式怎么改呢?

@Prev({
        @SQL(db = DB.ORACLE, value="SELECT seq_userid.nextval FROM dual")
    })

mysql支持自增,跟sqlserver一样,神马都不需要做

那其他数据库呢?
你说是数组,能写多个的
是不是这样写啊?


@Prev({ @SQL(db = DB.ORACLE, value="SELECT seq_userid.nextval FROM dual", db = DB.AAA, value="AAAA", db = DB.XXX, value="XXXX") })

不支持自增的数据才需要加这些东西

不支持自增的数据库才需要加这些东西

好吧,暂时支持oracle和sqlserver就差不多了
另外,请教下,如果在sqlserver和oracle中都使用这种整数型自增,作为表的ID,
会不会对以后迁移数据、合并数据、转换数据库(oracle转sqlserver、sqlserver转oracle)造成麻烦呢?

别使用数据库特有的数据类型就好了

最后请教下,在oracle中,你更推荐

@SQL(db = DB.ORACLE, value="SELECT seq_userid.nextval FROM dual",

还是使用触发器来写入序列,
你觉得哪种更好?

触发器比较好,因为并发性能好一些

添加回复
请先登陆
回到顶部