文件最后提交记录最后更新时间
1 个月前
1 个月前
1 个月前
README

orm-demo —— ACE ORM(对标 TypeORM)

演示 ace-orm 模块:声明式实体、仓储模式、真实 SQLite 后端、声明式事务,全程零运行时反射(实体映射由 @Entity 宏编译期生成)。

运行

source scripts/env.sh
cjpm build
./target/release/bin/orm_demo

核心用法

import aceboot::orm.*
import aceboot::framework_macros.*

// 1) 声明实体:@Entity 生成 UserMapper(表/列/DDL/行映射/参数,零反射)
@Entity["users"]
public class User {
    @Id    public var id: Int64 = 0       // 主键(自增)
    @Column public var name: String = ""  // 数据列(列名=字段名)
    @Column public var age: Int64 = 0
}

// 2) 连接 + 仓储
let ds = DataSource(SqliteDriver(":memory:"))   // 或文件路径 "app.db"
setGlobalDataSource(ds)                         // 供 @Transactional 使用
let repo = Repository<User>(ds, UserMapper())
repo.createTable()

// 3) CRUD(参数化,防注入)
let u = User(); u.name = "alice"; u.age = 30
let id = repo.insert(u)            // 返回自增 id 并回填 u.id
repo.findById(DbInt(id))           // ?User
repo.findAll()                     // Array<User>
repo.findBy("name", DbText("bob")) // 按列等值
repo.update(u); repo.deleteById(DbInt(id)); repo.count()

声明式事务

class UserService {
    let repo: Repository<User>
    init(repo: Repository<User>) { this.repo = repo }

    @Transactional                       // 成功 commit,抛异常自动 rollback 并重抛
    public func addTwo(a: User, b: User): Unit {
        repo.insert(a)
        repo.insert(b)
    }
}

@Transactional 把方法体包进全局数据源的事务。demo 里 addThenFail 插入后抛异常 → 计数不变,证明真实回滚。

设计要点

关注点 实现
实体映射 @Entity 宏生成 XMapper <: EntityMapper<X>,零反射
仓储 泛型 Repository<T>,一份实现服务所有实体(差异在 mapper)
后端 SqliteDriver 经 FFI 直连 libsqlite3(可换 Driver 接口的其他实现)
安全 SQL 全参数化(? 占位 + DbValue 绑定)
事务 @Transactional 织入 runInTransaction(全局数据源)

可执行模块需链接 sqlite:cjpm.toml 里 link-option = "-lsqlite3"。