Я пробую 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
}
}