`

关于bboss persistent主键生成机制的说明

阅读更多
4.14 主键的生成
bboss主键生成有两种模式,一种模式是在对象主键属性上加@PrimaryKey(uuid主键)或者@PrimaryKey(auto=true,pkname="xxxx")(pkname对应tableinfo中的TABLE_NAME子字段的值),另外一种模式就是通过DBUtil.getNextPrimaryKey方法再程序中获取(前提是表的主键信息需要配置到tableinfo中,可以支持uuid和oracle的sequence,以及mysql的自定义sequence)。

对于mysql之类可以自动产生主键的数据库,如果获取自动产生的主键请参考文档:
bboss持久层返回mysql自增主键功能说明


模式一 注解模式实例
自动生成uuid主键,生成的主键值会自动赋给id属性,这种模式不需要进行额外配置
public class POBean
{
	@PrimaryKey
	private String id ;
}

默认采用com.frameworkset.common.poolman.sql.StrongUuidGenerator生成uuid,用户可以自己实现接口
com.frameworkset.common.poolman.sql.IdGenerator来自定义uuid主键生成机制,自定义的uuid生成组件可以在poolman.xml文件中配置:
<datasource> 
....
<idGenerator>com.frameworkset.common.poolman.sql.StrongUuidGenerator</idGenerator>
......
</datasource> 


如何在程序中使用IdGenerator来生成主键:
com.frameworkset.common.poolman.sql.IdGenerator ienerator = com.frameworkset.common.poolman.DBUtil.getPool("bspf").getIdGenerator();//指定数据源
或者
com.frameworkset.common.poolman.sql.IdGenerator ienerator = com.frameworkset.common.poolman.DBUtil.getPool().getIdGenerator();//默认数据源					
String value = ienerator.getNextId();//获取主键


根据tableinfo中配置的主键信息生成记录主键,生成的主键值会自动赋给id属性
public class POBean
{
	@PrimaryKey(pkname="ListBean",auto=true)
	private String id ;
}



模式二实例 编程模式

主键信息表
Poolman可以自动生成表的主键,前提是将表的主键信息配置到tableinfo表中,其结构如下



[img]/upload/attachment/113888/557456e8-c104-35d1-83ba-866550098ee7.gif&quot; alt=&quot;[/img]



TABLE_NAME           VARCHAR2(255)   表名称                

   TABLE_ID_NAME        VARCHAR2(255),   表的主键名称

   TABLE_ID_INCREMENT   NUMBER(5),      表的主键自增值

   TABLE_ID_VALUE       NUMBER(20),  表的主键的当前值

   TABLE_ID_GENERATOR   VARCHAR2(255),  表的主键自定义生成机制,

可提供poolman之外的生成机制,

比如数据库sequence名称,要求TABLE_ID_TYPE是sequence

   TABLE_ID_TYPE        VARCHAR2(255), 表主键类型,取值范围:string,int,long,sequence

   TABLE_ID_PREFIX      VARCHAR2(255) 主键前缀,如果TABLE_ID_TYPE的值为string,则可以添加前缀,否则不可以


4.14.2人工获取主键的接口
com.frameworkset.common.poolman.DBUtil组件定义了一组getNextPrimaryKey静态方法,用户在程序中获取主键配置在tableinfo表中的主键信息。

1.      获取数字类型的主键

获取缺省数据库中表的主键信息

public static long getNextPrimaryKey(String tableName) throws SQLException

获取指定数据库中表的主键信息

public static long getNextPrimaryKey(String dbName,String tableName) throws SQLException


2.      获取字符串类型的主键

获取缺省数据库中表的主键信息

public static String getNextStringPrimaryKey(String tableName) throws SQLException


获取指定数据库中表的主键信息

public static String getNextStringPrimaryKey(String dbName,String tableName) throws SQLException


特别声明
持久层框架在poolman.xml配置文件中新增了配置属性:

false

可以通过该开关来控制是否启用为sql语句自动补全主键的功能,这样能够避免持久层框架去分析每一条insert语句,提升系统性能。

控制的开关autoprimarykey的值为false时,表示不自动补全insert语句中的主键值;为true时,表示启用自动补全主键的功能,但是主键信息必须配置在tableinfo表中。
  • 大小: 4.5 KB
分享到:
评论
3 楼 yin_bp 2014-09-11  
/** 主健 */
    @PrimaryKey(auto=true,pkname="sd_custom_unit")
    private String id;

改为:
@PrimaryKey(auto=true)
    private String id;

再看结果。
2 楼 huangjia7 2014-09-11  
huangjia7 写道
/** 主健 */
    @PrimaryKey(auto=true,pkname="sd_custom_unit")
    private String id;
    为什么id的值没有被设置上,已经从ORACLE中取出序列的值了。

还还报错如下:

数据库操作出错:未指定绑定变量的值:id



且数据库执行了打印序列的语句,但实际seq没有没有变化:
[2014-09-11 09:57:45][DEBUG][com.frameworkset.common.poolman.PreparedDBUtil] Execute JDBC prepared query statement:select SEQ_SD_CUSTOM_UNIT.nextval from dual
[2014-09-11 09:57:45][ERROR][com.bestride.pms.sd.service.CustomUnitService] 数据库操作出错:未指定绑定变量的值:id 
1 楼 huangjia7 2014-09-11  
/** 主健 */
    @PrimaryKey(auto=true,pkname="sd_custom_unit")
    private String id;
    为什么id的值没有被设置上,已经从ORACLE中取出序列的值了。

还还报错如下:

数据库操作出错:未指定绑定变量的值:id

相关推荐

Global site tag (gtag.js) - Google Analytics