如何在需要另一个实体时使用来自lombok的@Builder来构建一个实体?
How to use @Builder from lombok to build an entity when it needs another entity?
我试图为我的后端测试构建一个“Pessoa”实体 class,但它需要 属性 的“Cidade”类型,当我尝试通过一个新的 Cidade 时或实例化 Cidade 的构建器以创建一个新的有效构建器,我得到与 sql:
相关的错误
org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FK_PESSOA_CIDADE_ID: PUBLIC.PESSOA FOREIGN KEY(CIDADE_ID) REFERENCES PUBLIC.CIDADE(ID) (1)"; SQL statement:
insert into pessoa (apelido, cidade_id, cpf, hobbie, nome, time_coracao) values (?, ?, ?, ?, ?, ?) [23506-200]
https://www.h2database.com/javadoc/org/h2/api/ErrorCode.html
我已经知道在尝试插入或更新违反引用约束的行时会抛出代码 23506 的错误,因为引用的行不存在。
但是我不知道该怎么做才能解决,有人可以帮忙吗?
我曾尝试使用尚不存在的 ID 来创建新的 Cidade,但没有成功。我已经在这个错误上花费了 2 个多小时。
测试class:
@DataJpaTest
@ActiveProfiles("test")
@Log4j2
class PessoaRepositoryTest {
@Autowired
private PessoaRepository pessoaRepository;
@Test
void save_whenSuccessful(){
Pessoa pessoa2BSalva = PessoaCreator.criarPessoa2BSalva();
Pessoa pessoaSalva = this.pessoaRepository.save(pessoa2BSalva);
Assertions.assertThat(pessoaSalva).isNotNull();
Assertions.assertThat(pessoaSalva.getId()).isNotNull();
}
Pessoa2BSalva 方法:
public static Pessoa criarPessoa2BSalva(){
return Pessoa.builder()
.nome("Roger")
.cpf("54027892300")
.apelido("Rogerinho")
.timeCoracao("Flamengo")
.hobbie("Futebol")
.cidade(CidadeCreator.criarCidadeValida())
.build();
}
CriarCidadeValida 方法:
public static Cidade criarCidadeValida(){
return Cidade.builder()
.id(1L)
.nome("Formiga")
.estado("MG")
.qtdHabitantes(75000).build();
}
感谢任何类型的帮助
所以问题是我没有插入已经存在的 Cidade,所以我所做的是更改 @Test class 以保存 Cidade 并分配给我试图保存的 Pessoa。
经过 2 个多小时的研究,我在 上找到了我的解决方案,@Cristian Colorado answer
这是我的测试 class:
@Test
void save_whenSuccessful(){
Pessoa pessoa2BSalva = PessoaCreator.criarPessoa2BSalva();
Cidade cidade2BSalva = CidadeCreator.criarCidade2BSalva();
Cidade cidadeSalva = this.cidadeRepository.save(cidade2BSalva);
pessoa2BSalva.setCidade(cidadeSalva);
Pessoa pessoaSalva = this.pessoaRepository.save(pessoa2BSalva);
Assertions.assertThat(pessoaSalva).isNotNull();
Assertions.assertThat(pessoaSalva.getId()).isNotNull();
}
我试图为我的后端测试构建一个“Pessoa”实体 class,但它需要 属性 的“Cidade”类型,当我尝试通过一个新的 Cidade 时或实例化 Cidade 的构建器以创建一个新的有效构建器,我得到与 sql:
相关的错误org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FK_PESSOA_CIDADE_ID: PUBLIC.PESSOA FOREIGN KEY(CIDADE_ID) REFERENCES PUBLIC.CIDADE(ID) (1)"; SQL statement: insert into pessoa (apelido, cidade_id, cpf, hobbie, nome, time_coracao) values (?, ?, ?, ?, ?, ?) [23506-200]
https://www.h2database.com/javadoc/org/h2/api/ErrorCode.html
我已经知道在尝试插入或更新违反引用约束的行时会抛出代码 23506 的错误,因为引用的行不存在。
但是我不知道该怎么做才能解决,有人可以帮忙吗?
我曾尝试使用尚不存在的 ID 来创建新的 Cidade,但没有成功。我已经在这个错误上花费了 2 个多小时。
测试class:
@DataJpaTest
@ActiveProfiles("test")
@Log4j2
class PessoaRepositoryTest {
@Autowired
private PessoaRepository pessoaRepository;
@Test
void save_whenSuccessful(){
Pessoa pessoa2BSalva = PessoaCreator.criarPessoa2BSalva();
Pessoa pessoaSalva = this.pessoaRepository.save(pessoa2BSalva);
Assertions.assertThat(pessoaSalva).isNotNull();
Assertions.assertThat(pessoaSalva.getId()).isNotNull();
}
Pessoa2BSalva 方法:
public static Pessoa criarPessoa2BSalva(){
return Pessoa.builder()
.nome("Roger")
.cpf("54027892300")
.apelido("Rogerinho")
.timeCoracao("Flamengo")
.hobbie("Futebol")
.cidade(CidadeCreator.criarCidadeValida())
.build();
}
CriarCidadeValida 方法:
public static Cidade criarCidadeValida(){
return Cidade.builder()
.id(1L)
.nome("Formiga")
.estado("MG")
.qtdHabitantes(75000).build();
}
感谢任何类型的帮助
所以问题是我没有插入已经存在的 Cidade,所以我所做的是更改 @Test class 以保存 Cidade 并分配给我试图保存的 Pessoa。
经过 2 个多小时的研究,我在
这是我的测试 class:
@Test
void save_whenSuccessful(){
Pessoa pessoa2BSalva = PessoaCreator.criarPessoa2BSalva();
Cidade cidade2BSalva = CidadeCreator.criarCidade2BSalva();
Cidade cidadeSalva = this.cidadeRepository.save(cidade2BSalva);
pessoa2BSalva.setCidade(cidadeSalva);
Pessoa pessoaSalva = this.pessoaRepository.save(pessoa2BSalva);
Assertions.assertThat(pessoaSalva).isNotNull();
Assertions.assertThat(pessoaSalva.getId()).isNotNull();
}