Spring Data JDBC - неизменный владелец отношения OneToMany - PullRequest
1 голос
/ 08 июня 2019

Я пробую 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 работать корректно для изменяемых классов. Мне удалось заставить его работать на неизменного игрока. Тем не менее, я не могу заставить Team Mapping работать без @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);

И мой тест Спока:

@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 Ответ

1 голос
/ 10 июня 2019

Вы столкнулись с ошибкой в ​​Spring Data JDBC: https://jira.spring.io/browse/DATAJDBC-127

В настоящее время сущности или коллекции сущностей не работают в качестве аргументов конструктора. Создайте конструктор без этих аргументов и добавьте сеттеры или, если вы хотите остаться неизменными, вянет для них.

...