如何在需要另一个实体时使用来自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();
    }