我尝试在我的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);
IdentifierResult
是int
的一个简单 Package 器,它捕获所创建记录的ID。
我尝试过使用INTEGER
、NOT NULL
和PRIMARY KEY
的每一个有效组合(包含和不包含AUTOINCREMENT
)创建id,结果都是一样的。我还尝试过在创建id显式设置为1的表后立即写入一个虚拟行,但后续条目仍然使用空id写入。
任何指导都将不胜感激!
1条答案
按热度按时间vxf3dgd41#
事实证明,这与MyBatis或我的代码无关,只是几个小错误的组合:
1.我的项目正在加载一个sqlite db文件,该文件中的表初始化不正确,导致我更改create语句的各种尝试基本上被忽略。
1.包含所有create语句的单个文件是only executing the first statement。
我删除了坏的资源,并将创建的文件拆分成单独的文件,除了疯狂的测试导致我搞砸了DAOMap器的地方之外,一切都运行得很顺利。👍