Spring 数据 JDBC - OneToMany 关系的不可变所有者
Spring Data JDBC - immutable owner of OneToMany relation
我正在试用 Spring 数据 JDBC,我认为不可变实体是这里的关键特性。
我想在 Team 和 Player 之间建立一对多关系的模型,并使这些实体不可变。我现在的工作是:
@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 关系正常工作。我设法让它适用于不可变的播放器。但是,如果没有 @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
}
}
您在 Spring 数据 JDBC 中遇到了错误:https://jira.spring.io/browse/DATAJDBC-127
目前,实体或实体集合不能用作构造函数参数。
创建一个没有这些参数的构造函数并添加 setter,或者如果你想为它们保持不可变 withers。
我正在试用 Spring 数据 JDBC,我认为不可变实体是这里的关键特性。
我想在 Team 和 Player 之间建立一对多关系的模型,并使这些实体不可变。我现在的工作是:
@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 关系正常工作。我设法让它适用于不可变的播放器。但是,如果没有 @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
}
}
您在 Spring 数据 JDBC 中遇到了错误:https://jira.spring.io/browse/DATAJDBC-127
目前,实体或实体集合不能用作构造函数参数。 创建一个没有这些参数的构造函数并添加 setter,或者如果你想为它们保持不可变 withers。