带有复合主键的Spring Data JDBC

后端开发 2026-07-12

我在使用 Spring Boot / Spring Data JDBC 4.0.3JMolecules 2025.0.2

我有一个简单的类:

@Getter
@AggregateRoot
@AllArgsConstructor
public class Service {

  @Id
  private final ServiceId id;
  private String name;
  @Version
  private Integer version;

}

record ServiceId(UUID tenantId, UUID id) implements Identifier {
}

以及一个简单的仓库:

public interface ServiceRepo extends ListCrudRepository<Service, ServiceId> {
}

但在尝试保存它时:

repo.save(new Service(new ServiceId(UUID.randomUUID(), UUID.randomUUID()), name, null))

在底层,它会尝试做 SQL [INSERT INTO \"service\" (\"id\", \"name\", \"version\")

复合主键被忽略了。这里到底出了什么问题?
我本来预计应该是:

SQL [INSERT INTO \"service\" (\"tenant_id\", \"id\", \"name\", \"version\")

解决方案

问题在于,当在类路径上有jMolecules时,Spring Data注册了一个 IdentifierToPrimitivesConverter,这使得任何继承自 org.jmolecules.ddd.typesIdentifier 的类型成为简单类型,从而阻止将其展平成嵌入式实体。

目前唯一的解决方法是让你的复合主键不要继承自 Identifier

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章