使用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
相关产品推荐
相关产品推荐

