java SQLite + MyBatis为自动递增主键插入空值

9cbw7uwe  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(171)

我尝试在我的Java/Gradle项目中使用单个MyBatis实现来从实时MySQL示例或静态SQLite示例进行读/写(目前正在使用一个文件进行调试,但希望能长期在内存中)。MySQL的一切工作都很好,但由于某种原因,当我使用SQLite时,整数主键(应该是镜像rowID afaik)被写为null。起初我以为这可能是rowID别名的实现方式,但一旦插入记录,就无法使用id字段中的rowID获取它。
SQLite表的Create语句:

DROP TABLE `event`;
CREATE TABLE `event` (
    `id` INTEGER PRIMARY KEY,
    `time` DATETIME NOT NULL,
    `duration` INT NOT NULL,
    `summary_id` INT NOT NULL
);

用于get和insert的MyBatisMap器:

@Select("SELECT * FROM event WHERE id=#{id}")
Event get(final int id);

@Insert({"INSERT INTO",
    "event(time, duration, summary_id)",
    "VALUES(#{e.time}, #{e.duration}, #{summaryId})"})
@Options(useGeneratedKeys=true, keyProperty = "result.id")
void insert(@Param("e") final Event item, @Param("summaryId") final int summaryId, @Param("result") final IdentifierResult result);

IdentifierResultint的一个简单 Package 器,它捕获所创建记录的ID。
我尝试过使用INTEGERNOT NULLPRIMARY KEY的每一个有效组合(包含和不包含AUTOINCREMENT)创建id,结果都是一样的。我还尝试过在创建id显式设置为1的表后立即写入一个虚拟行,但后续条目仍然使用空id写入。
任何指导都将不胜感激!

vxf3dgd4

vxf3dgd41#

事实证明,这与MyBatis或我的代码无关,只是几个小错误的组合:
1.我的项目正在加载一个sqlite db文件,该文件中的表初始化不正确,导致我更改create语句的各种尝试基本上被忽略。
1.包含所有create语句的单个文件是only executing the first statement
我删除了坏的资源,并将创建的文件拆分成单独的文件,除了疯狂的测试导致我搞砸了DAOMap器的地方之外,一切都运行得很顺利。👍

相关问题