企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 主键 > 表格主键以数据库定义为准,POJO必须严格的以数据库定义来使用@AutoId,@AssingId,和@SeqId。如果是视图,想要一个逻辑主键,这必须使用@Table(isView=true),BeetlSQL 则认为@AssingId标注的属性的是视图主键 @AutoID,作用于属性字段或者getter方法,告诉beetlsql,这是自增主键,对应于数据自增长 ```java @AutoID Integer myId; ``` @AssignID,作用于属性字段或者getter方法,告诉beetlsql,这是程序设定 ```java @AssignID Integer id; ``` 代码设定主键允许像@AssignID 传入id的生成策略以自动生成序列,BeetlSQL默认提供了一个snowflake算法,一个用于分布式环境的id生成器([https://github.com/twitter/snowflake](https://github.com/twitter/snowflake)),生成器的名字是simple ```java @AssignID("simple") @AssignID() Long id; ``` 这个simple 算法不能用在实际项目里,因为实际雪花算法需要配置工作机器ID,beetlsql的simple生成器没有提供 你可以实现自己的id生成策略,比如最常用的UUID ```java sqlManager.addIdAutonGen("uuid", new IDAutoGen(){ @Override public Object nextID(String params) { return UUID.randomUUID().toString(); } }); ``` ```java @AssignID("uuid") String id; ``` 需要注意Java自带的 UUID可能有性能上的问题,因为UUID的随机数来自于操作系统生成,因为操作系统生成不了足够的uuid导致性能能下降。可以搜索uuid+urandom 从网上查找改善Java内置UUID的性能,或者使用第三方的UUID,如`uuid-creator` - @SeqID(name="xx_seq"),告诉beetlsql,这是序列主键,目前只有H2,Oracle和Postgres或者DB2使用序列主键,以源码单元测试为例子,如下DeviceDetail具有id,序列名称是`label_sequence` ```java @Data public abstract class BaseSeqIdEntity<ID> extends BaseEntity implements Serializable{ @SeqID(name="label_sequence") protected ID id; } @Data @Table(name="device_detail") public class DeviceDetail extends BaseSeqIdEntity<Integer>{ String json; } ``` IdTest的seqIdTest如下 ```java public class IdTest extends BaseTest { @Test public void seqIdTest(){ DeviceDetail data = new DeviceDetail(); data.setJson("{}"); sqlManager.insert(data); Assert.assertNotNull(data.getId()); System.out.println(data); } } ``` 执行后,可以看到H2的输出 ```java ┏━━━━━ Debug [deviceDetail.$insert] ━━━ ┣ SQL: insert into device_detail (ID ,JSON ) values (NEXT VALUE FOR label_sequence ,? ) ┣ 参数: [{}] ┣ 位置: org.beetl.sql.id.IdTest.seqIdTest(IdTest.java:47) ┣ 时间: 7ms ┣ 更新: [1] ┗━━━━━ Debug [deviceDetail.$insert] ━━━ ``` H2Style.getSeqValue返回了序列名称对应的求值语句,Oralce,Postgres类似,如下是DbStyle的getSeqValue实现 ```java public class H2Style extends AbstractDBStyle { @Override public String getSeqValue(String seqName) { return "NEXT VALUE FOR "+seqName; } } public class OracleStyle extends AbstractDBStyle { @Override public String getSeqValue(String seqName) { return seqName+".nextval"; } } public class OracleStyle extends AbstractDBStyle { @Override public String getSeqValue(String seqName) { return "nextval('" + seqName + "')"; } } ``` 对于支持多种数据库的,这些annotation可以叠加在一起,但作为跨库更好的选择是使用@AssignId,并自定义个id生成策略