Pular para o conteúdo principal

Questão de Programação — Java — FGV 2023

ProgramaçãoJava
Código
fg059288
Banca
FGV
Órgão
AL-MA
Ano
2023
Nível
Superior
Cargo
Técnico de Gestão Administrativa - Analista de Sistemas
Analise o código a seguir, escrito em linguagem Java e com anotações do Hibernate 6.1. Considere que os métodos de acesso get e set foram omitidos da especificação das classes abaixo para efeitos de brevidade.Imagem associada para resolução da questãoSobre o modelo de banco de dados decorrente deste mapeamento objeto-relacional, é correto afirmar que
  1. Ao atributo nome da tabela Pessoa será do tipo VARCHAR.
  2. Bo atributo salario da tabela Professor não poderá ser nulo.
  3. Co atributo id da tabela Aluno será uma chave primária.
  4. Do atributo diurno da tabela Pessoa poderá ter só 2 valores.
  5. Eo atributo cpf da tabela Pessoa poderá ter 11 caracteres.
Revelar gabarito e comentário

GabaritoC — o atributo id da tabela Aluno será uma chave primária.

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”.

Mapeamento Objeto-Relacional com Hibernate: Análise do Modelo de Banco de Dados

Gabarito: letra C. No mapeamento objeto-relacional com Hibernate, a anotação @Id em um atributo de uma entidade define que ele será a chave primária da tabela correspondente. Portanto, o atributo id da classe Aluno, se anotado com @Id, será a chave primária da tabela Aluno. As demais alternativas apresentam afirmações incorretas sobre os tipos de dados e restrições geradas pelo mapeamento.

O Hibernate é um framework de mapeamento objeto-relacional (ORM) que transforma classes Java em tabelas de banco de dados relacionais. Cada atributo da classe vira uma coluna na tabela, e o tipo do atributo Java é convertido para um tipo SQL correspondente. Por exemplo, um String em Java pode ser mapeado para VARCHAR, TEXT, ou CLOB, dependendo da configuração e do dialeto do banco. Um double ou float pode ser mapeado para DOUBLE, FLOAT, ou NUMERIC. A anotação @Column permite especificar detalhes como tamanho, nulabilidade e unicidade. A anotação @Id marca o atributo como chave primária, e @GeneratedValue define a estratégia de geração de valores para essa chave.

A questão apresenta um cenário com herança entre classes (Pessoa, Professor, Aluno). O Hibernate oferece estratégias para mapear herança, como SINGLE_TABLE (uma única tabela para todas as classes), JOINED (uma tabela para cada classe, com junção por chave estrangeira) e TABLE_PER_CLASS (uma tabela para cada classe concreta). A estratégia padrão é SINGLE_TABLE, que cria uma única tabela com um discriminador para distinguir os tipos. Nesse caso, a tabela Pessoa conteria todas as colunas de todas as classes da hierarquia, e as colunas específicas de Professor e Aluno seriam anuláveis para registros de outros tipos.

A pegadinha da questão está em analisar cada alternativa com base no que o mapeamento realmente gera, considerando a estratégia de herança e as anotações. A alternativa C é a única que afirma corretamente que o atributo id será uma chave primária, o que é uma consequência direta da anotação @Id. As demais alternativas fazem suposições incorretas sobre tipos de dados e restrições que não são garantidas pelo mapeamento padrão.

Critério

Alternativa C (correta)

Alternativas A, B, D, E (incorretas)

Base da afirmação

Anotação @Id define chave primária

Suposições sobre tipos/nulabilidade sem anotações explícitas

Garantia pelo mapeamento

Sempre verdadeiro, independente da estratégia de herança

Não garantido; depende de @Column, dialeto e tipo Java

Exemplo de erro

A: String pode virar TEXT/CLOB; B: sem nullable=false é anulável; D: diurno pode ser String; E: sem length=11 tamanho varia

Alternativa A — ❌ Incorreta

A alternativa afirma que o atributo nome da tabela Pessoa será do tipo VARCHAR. Embora seja comum que um String em Java seja mapeado para VARCHAR, isso não é garantido. O Hibernate pode mapear String para VARCHAR, TEXT, ou CLOB, dependendo da configuração e do dialeto do banco. Sem a anotação @Column especificando o tipo, não é possível afirmar com certeza que será VARCHAR. Portanto, a afirmação é incorreta.

Alternativa B — ❌ Incorreta

A alternativa afirma que o atributo salario da tabela Professor não poderá ser nulo. A nulabilidade de uma coluna é definida pela anotação @Column(nullable = false). Sem essa anotação, a coluna é anulável por padrão. Além disso, em uma estratégia de herança SINGLE_TABLE, as colunas específicas de subclasses são anuláveis para registros de outros tipos. Portanto, não é possível afirmar que salario não poderá ser nulo.

Alternativa C — ✅ Correta ⟵ GABARITO

A alternativa afirma que o atributo id da tabela Aluno será uma chave primária. Isso é correto, pois a anotação @Id em um atributo de uma entidade JPA/Hibernate define que ele será a chave primária da tabela correspondente. Independentemente da estratégia de herança, o atributo id é a chave primária da entidade Aluno.

Alternativa D — ❌ Incorreta

A alternativa afirma que o atributo diurno da tabela Pessoa poderá ter só 2 valores. Se o atributo diurno for do tipo boolean em Java, ele será mapeado para um tipo booleano no banco, que pode ter valores TRUE ou FALSE. No entanto, a afirmação é vaga e não especifica o tipo do atributo. Se diurno for um String, por exemplo, poderia ter mais de 2 valores. Portanto, a afirmação é incorreta.

Alternativa E — ❌ Incorreta

A alternativa afirma que o atributo cpf da tabela Pessoa poderá ter 11 caracteres. O tamanho de uma coluna é definido pela anotação @Column(length = 11). Sem essa anotação, o tamanho padrão pode variar. Além disso, o cpf pode ser mapeado como String ou como um tipo numérico, o que afetaria o tamanho. Portanto, não é possível afirmar que terá exatamente 11 caracteres.

Gabarito: letra C

Link permanente: /questoes/fg059288