Spring Data JDBC 一对多与自定义列名

问题描述

我使用的是 spring-boot-starter-data-jdbc 2.4.2。在我的域聚合中,我需要映射从另一个表中的列填充的字符串列表。这是一个遗留数据库,所以我无法控制表名和列名,需要使用自定义名称。我看到有一个 @MappedCollection 注释,但在这种情况下看不到如何使用它。下面是我的课:

@Data
@Table("NMT_MOVIE_THEATRE")
public class MovieTheatre {

    @Id
    @Column("MOVIE_THEATRE_ID")
    private Long id;

    @Column("ZIP_CODE")
    private String zipCode;

    // this comes from table NMT_CURRENT_MOVIE,column CM_ID,joined by MOVIE_THEATRE_ID
    private List<String> currentMovieIds;
}

使用 Spring Data JDBC,如何创建一对多关系?

解决方法

将您的 String 包裹在一个小实体中。

@Table("NMT_CURRENTMOVIE")
class MovieId {
    @Id
    @Column("CM_ID")
    final String id

    // add constructor,equals and hashCode here or generate using Lombok
}

然后在 MovieTheatre 中使用它。由于您没有用于索引的列,因此要使用的正确集合是 Set

// ...
class MovieTheatre {
    // ...
    @MappedCollection(idColumn="MOVIE_THEATRE_ID")
    Set<MovieId> currentMovieIds;
}

请注意,equalshashCode 以及采用其中使用的所有参数的构造函数都很重要,因为实体用于 Set