mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-15 03:55:09 +08:00
fix(db): application-assigned ids for entities lacking auto-increment on PostgreSQL-compatible dialects
Eight entities (fact, fact contradiction, morning-card seen, wiki hot cache / relation / transformation / transformation run / image caption cache) declared IdType.AUTO while their PostgreSQL-compatible migrations define the primary key as a plain BIGINT with no identity default. MyBatis-Plus omits the id column from the generated INSERT under AUTO, so every insert fails with a NOT NULL violation on those databases — silently on paths that only log a warning. Switch them to snowflake ASSIGN_ID, which works on all dialects since auto-increment columns accept explicit values. Add a parameterized contract test pinning the id strategy for all eight entities.
This commit is contained in:
parent
6aad9fd945
commit
e2c3cfd5b4
@ -14,7 +14,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_fact_contradiction")
|
@TableName("mate_fact_contradiction")
|
||||||
public class FactContradictionEntity {
|
public class FactContradictionEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long agentId;
|
private Long agentId;
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_fact")
|
@TableName("mate_fact")
|
||||||
public class FactEntity {
|
public class FactEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long agentId;
|
private Long agentId;
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_morning_card_seen")
|
@TableName("mate_morning_card_seen")
|
||||||
public class MorningCardSeenEntity {
|
public class MorningCardSeenEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_wiki_hot_cache")
|
@TableName("mate_wiki_hot_cache")
|
||||||
public class WikiHotCacheEntity {
|
public class WikiHotCacheEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long kbId;
|
private Long kbId;
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_wiki_image_caption_cache")
|
@TableName("mate_wiki_image_caption_cache")
|
||||||
public class WikiImageCaptionCacheEntity {
|
public class WikiImageCaptionCacheEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/** SHA-256 hex digest (64 chars, lowercase) of the original image bytes. */
|
/** SHA-256 hex digest (64 chars, lowercase) of the original image bytes. */
|
||||||
|
|||||||
@ -29,7 +29,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_wiki_relation")
|
@TableName("mate_wiki_relation")
|
||||||
public class WikiRelationEntity {
|
public class WikiRelationEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long kbId;
|
private Long kbId;
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_wiki_transformation")
|
@TableName("mate_wiki_transformation")
|
||||||
public class WikiTransformationEntity {
|
public class WikiTransformationEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import java.time.LocalDateTime;
|
|||||||
@TableName("mate_wiki_transformation_run")
|
@TableName("mate_wiki_transformation_run")
|
||||||
public class WikiTransformationRunEntity {
|
public class WikiTransformationRunEntity {
|
||||||
|
|
||||||
@TableId(type = IdType.AUTO)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private Long transformationId;
|
private Long transformationId;
|
||||||
|
|||||||
@ -0,0 +1,49 @@
|
|||||||
|
package vip.mate.architecture;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
import vip.mate.memory.fact.model.FactContradictionEntity;
|
||||||
|
import vip.mate.memory.fact.model.FactEntity;
|
||||||
|
import vip.mate.memory.model.MorningCardSeenEntity;
|
||||||
|
import vip.mate.wiki.model.WikiHotCacheEntity;
|
||||||
|
import vip.mate.wiki.model.WikiImageCaptionCacheEntity;
|
||||||
|
import vip.mate.wiki.model.WikiRelationEntity;
|
||||||
|
import vip.mate.wiki.model.WikiTransformationEntity;
|
||||||
|
import vip.mate.wiki.model.WikiTransformationRunEntity;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contract test: these entities are backed by tables whose PostgreSQL-compatible
|
||||||
|
* dialect defines the primary key as a plain BIGINT without an identity/sequence
|
||||||
|
* default. {@code IdType.AUTO} makes MyBatis-Plus omit the id column from the
|
||||||
|
* generated INSERT and rely on database-generated keys, which violates the
|
||||||
|
* NOT NULL constraint on those databases. Application-assigned snowflake ids
|
||||||
|
* ({@code IdType.ASSIGN_ID}) work across every supported dialect, since
|
||||||
|
* auto-increment columns also accept explicit values.
|
||||||
|
*/
|
||||||
|
class AutoIncrementFreePrimaryKeyTest {
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@ValueSource(classes = {
|
||||||
|
FactEntity.class,
|
||||||
|
FactContradictionEntity.class,
|
||||||
|
MorningCardSeenEntity.class,
|
||||||
|
WikiHotCacheEntity.class,
|
||||||
|
WikiRelationEntity.class,
|
||||||
|
WikiTransformationEntity.class,
|
||||||
|
WikiTransformationRunEntity.class,
|
||||||
|
WikiImageCaptionCacheEntity.class
|
||||||
|
})
|
||||||
|
void primaryKeyUsesApplicationAssignedId(Class<?> entityClass) throws NoSuchFieldException {
|
||||||
|
TableId tableId = entityClass.getDeclaredField("id").getAnnotation(TableId.class);
|
||||||
|
|
||||||
|
assertNotNull(tableId, entityClass.getSimpleName() + ".id must be annotated with @TableId");
|
||||||
|
assertEquals(IdType.ASSIGN_ID, tableId.type(),
|
||||||
|
entityClass.getSimpleName() + " must use application-assigned ids: its primary key"
|
||||||
|
+ " column has no auto-increment default on PostgreSQL-compatible databases");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user