Spring Data JDBC-OneToMany关系的不可变所有者

时间:2019-06-08 11:37:58

标签: spring spring-data-jdbc

我正在尝试Spring Data JDBC,并且我认为不可变实体是此处的关键功能。

我想对团队和玩家之间的一对多关系进行建模,并使这些实体不可变。我现在正在工作的是:

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Team {
  @Id
  @Wither
  private Integer id;

  private String name;
  private List<Player> players;
}
@Value
public class Player {
  @Id
  @Wither
  Integer id;
  String name;
  public static Player of(String name) {
    return new Player(null, name);
  }
}

我设法使OneToMany关系对于可变类正常工作。我设法使其适用于不可变的Player。但是,如果没有@NoArgsConstructor@Value而不是我现在拥有的,我将无法使用团队映射。我收到奇怪的消息,好像缺少此构造函数时,Spring Data JDBC开始看到不同的映射:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "players_id" not found [42122-199]

如果有人尝试重新创建该方案,这是我的h2模式:

create table team (id serial primary key, name varchar);
create table player (id serial primary key, name varchar, team int references team(id), team_key int);

我的Spock测试:

@SpringBootTest
class TeamRepositoryTest extends Specification {
    @Autowired
    TeamRepository teamRepository

    def "Context loads"() {
        given:
        def rick = Player.of("Rick")
        def morty = Player.of("Morty")
        def team = new Team(null, "Rick and Morty", Arrays.asList(rick, morty))

        when:
        def savedTeam = teamRepository.save(team)

        then:
        def savedTeamOpt = teamRepository.findById(savedTeam.id)
        Team retrievedTeam = savedTeamOpt.get()
        retrievedTeam.id == savedTeam.id
        retrievedTeam.name == "Rick and Morty"
        retrievedTeam.players.size() == 2
    }
}

1 个答案:

答案 0 :(得分:1)

您在Spring Data JDBC中遇到一个错误:https://jira.spring.io/browse/DATAJDBC-127

当前,实体或实体集合无法用作构造函数参数。 创建没有这些参数的构造函数,并添加setter,或者如果您想让它们保持不变,请使用它们。