You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Micronaut Data JDBC带EmbeddedId插入实体时出现重复列错误

解决Micronaut Data JDBC插入时重复列的问题

问题原因

你遇到的SQL错误是因为Micronaut Data JDBC生成INSERT语句时,重复添加了document_uid和metadata_key列。这是因为你的DocumentMetadataJDBCEntity类中,除了@EmbeddedId内部的属性,还额外定义了getDocumentUid()和getMetadataKey()方法——Micronaut Data会默认将类的getter方法对应的属性映射到数据库列,导致框架把这两个方法识别为独立的字段,和嵌入式ID里的字段重复,最终生成了重复列的SQL语句。

解决方案

有两种方式可以解决这个问题:

方案1:移除额外的getter方法

直接删除实体类中定义的getDocumentUid()和getMetadataKey()方法,因为这些属性已经可以通过getMetadataPk()访问:

@MappedEntity(value = "document_metadata")
@AllArgsConstructor
@EqualsAndHashCode
public class DocumentMetadataJDBCEntity implements DocumentMetadata {

    @Embeddable
    @AllArgsConstructor
    public static class MetadataPk {

        @MappedProperty(value = "document_uid")
        @NotNull
        private UUID documentUid;

        @MappedProperty(value = "metadata_key")
        @NotNull
        private String metadataKey;

        public UUID getDocumentUid() {
            return documentUid;
        }

        public String getMetadataKey() {
            return metadataKey;
        }

    }

    @EmbeddedId
    private MetadataPk metadataPk;

    @NotNull
    private String metadataValue;

    public MetadataPk getMetadataPk() {
        return metadataPk;
    }

    @Override
    public String getMetadataKey() {
        return getMetadataPk().getMetadataKey();
    }

    @Override
    public String getMetadataValue() {
        return metadataValue;
    }

    // 移除这两个重复映射的方法
    // public UUID getDocumentUid() {
    //     return getMetadataPk().getDocumentUid();
    // }

}

方案2:保留方法但添加@Transient注解

如果你需要保留这些快捷访问的方法,可以给它们加上@Transient注解,告诉Micronaut Data不要将这些方法对应的属性映射到数据库列:

@MappedEntity(value = "document_metadata")
@AllArgsConstructor
@EqualsAndHashCode
public class DocumentMetadataJDBCEntity implements DocumentMetadata {

    // ... 其他代码保持不变 ...

    @Transient // 添加注解标记为非数据库映射字段
    public UUID getDocumentUid() {
        return getMetadataPk().getDocumentUid();
    }

}

验证

修改后重新执行插入操作,Micronaut Data生成的INSERT语句就不会再包含重复的列,错误会被修复。

内容的提问来源于stack exchange,提问作者dcalap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:25:16