Questão de Programação — Frameworks Java — FCC 2019
Programação›Frameworks Java
Código
fc053972
Banca
FCC
Órgão
Prefeitura de Manaus - AM
Ano
2019
Cargo
Assistente Técnico de Tecnologia da Informação - Programador
Em uma aplicação Java web que utiliza o Hibernate, um programador deseja adicionar uma nova instância de entidade ao contexto de persistência e, para isso, digitou o fragmento de código abaixo em um ambiente ideal.Contribuinte contribuinte = new Contribuinte();contribuinte.setNome("Maria da Silva");session.persist(contribuinte) ;Nesse trecho de código o objeto contribuinte
Afoi salvo no banco de dados, pois a instância do objeto já estava em estado transient, ou seja, havia uma conexão estabelecida com o banco de dados.
Bainda não foi salvo no banco de dados, pois o método persist apenas torna o objeto persistente, necessitando obrigatoriamente de uma chamada ao método save na sequência para salvar o objeto.
Cainda não foi salvo no banco de dados, pois a geração de instruções INSERT ocorrerá somente após um commit da transação, flush ou fechamento da sessão.
Dmudou para o estado detached e foi salvo no banco, uma vez que o método persist já executa o comando INSERT automaticamente para objetos neste estado.
Eserá descartado, pois o objeto não foi colocado no estado transient, ou seja, não está associado à sessão e, por isso, não poderá ser salvo no banco de dados.
Revelar gabarito e comentário▾
GabaritoC — ainda não foi salvo no banco de dados, pois a geração de instruções INSERT ocorrerá somente após um commit da transação, flush ou fechamento da sessão.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Hibernate – Ciclo de vida de entidades e método persist()
Gabarito: letra C. O método session.persist() apenas torna uma entidade persistente (estado managed), mas não gera imediatamente a instrução INSERT no banco de dados. A execução do comando SQL ocorre apenas no momento do flush (que pode ser disparado por commit, session.flush() explícito ou fechamento da sessão).
A questão testa o conhecimento sobre os estados das entidades no Hibernate:
Estado
Descrição
Transient
Objeto recém-criado, não associado a uma sessão.
Persistent (Managed)
Objeto associado à sessão; suas alterações são rastreadas.
Detached
Objeto que já foi persistente, mas a sessão foi fechada.
O método persist() transfere o objeto do estado transient para persistent, mas não executa o INSERT imediato – ele apenas agenda a inserção para o próximo flush. Essa é a diferença fundamental para quem espera uma sincronização instantânea com o banco.
1TransientObjeto novo
2persist()Torna managed
3Flush/CommitGera INSERT
4PersistentNo banco
5Close sessionDetached
LEVEL · soulevel.com.br
Análise das alternativas
Alternativa A — ❌ Incorreta
Afirma que o objeto foi salvo no banco porque estava em estado transient e havia conexão estabelecida. O erro: o método persist() não salva imediatamente; ele apenas torna o objeto persistent. A existência de conexão não basta – a geração do INSERT depende do flush.
Alternativa B — ❌ Incorreta
Diz que o objeto ainda não foi salvo (correto), mas exige obrigatoriamente uma chamada ao método save() posteriormente (incorreto). No Hibernate, persist() já é suficiente para deixar o objeto persistent; não há necessidade de chamar save() (inclusive, save() é um método antigo e não padrão JPA). O erro está na obrigatoriedade de um método adicional.
Alternativa C — ✅ Correta ⟵ GABARITO
Afirma que a instrução INSERT só será gerada após um commit, flush ou fechamento da sessão. É exatamente o comportamento do Hibernate: o persist() apenas marca o objeto como persistent e agenda a inserção; a execução efetiva ocorre no flush. Por isso, o objeto ainda não foi salvo no banco no momento da chamada do persist().
Alternativa D — ❌ Incorreta
Afirma que o objeto mudou para o estado detached e foi salvo imediatamente. O erro é duplo: (1) persist() leva ao estado persistent, não detached; (2) o INSERT não é executado automaticamente.
Alternativa E — ❌ Incorreta
Diz que o objeto será descartado por não estar no estado transient e não estar associado à sessão. Na verdade, o objeto estava em transient e o persist() justamente o associa à sessão (torna persistent). Portanto, ele não será descartado – será salvo posteriormente.
Resumo: O persist() apenas agenda a persistência. O INSERT só ocorre no flush (commit/fechamento). Essa é a chave para acertar questões sobre o ciclo de vida do Hibernate.