Quando o J2EE foi substituído pelo JEE5, e as configurações via XML passaram a ser efetuadas com base em anotações, as entidades anotadas do JPA passaram a ser utilizadas no lugar dos Entity Beans. Para definir uma chave primária com geração automática de valores, de forma independente do tipo de banco de dados, a configuração deve ser:
- A)@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
Errada, porque `GenerationType.IDENTITY` depende do recurso nativo de auto incremento do banco e não é a opção mais portável.
- B)@Collumn(name="Id") @Sequence(name="seq_chaves")
Errada, porque `@Collumn` está grafado incorretamente e `@Sequence` não é a anotação padrão do JPA para esse caso.
- C)@Collumn(name="Id") @Table(name="tab_chaves")
Errada, porque `@Collumn` também está incorreto e `@Table` não define estratégia de geração de chave primária.
- D)@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequenceGen") @SequenceGenerator(name="sequenceGen", sequenceName=" seq_chaves")
Errada, porque `SEQUENCE` depende de sequence do banco, então não atende ao requisito de independência do tipo de banco de dados.
- E)@Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "tableGen") @TableGenerator(name = "tableGen", table = "tab_chaves", pkColumnName = "id", pkColumnValue = "tabelaX", valueColumnName = "valor")
Certa, porque a estratégia `TABLE` com `@TableGenerator` é a forma portátil de gerar chaves primárias no JPA.
Gabarito: E
No JPA, a chave primária pode ser gerada de várias formas: por identidade do banco, por sequência ou por uma tabela auxiliar de controle. Quando a questão pede geração automática de valores de forma independente do tipo de banco de dados, a ideia é buscar a solução mais portátil possível, isto é, aquela que não dependa de recurso específico do SGBD. Nesse cenário, `GenerationType.IDENTITY` amarra a geração ao mecanismo nativo do banco, então perde portabilidade. Já `GenerationType.SEQUENCE` exige suporte a sequence, o que também não existe em todos os bancos. A saída mais universal é a estratégia baseada em tabela, porque o JPA usa uma tabela para guardar e atualizar o próximo valor a ser utilizado. Por isso, o gabarito é a alternativa E. Ela usa `@Id` para indicar a chave primária e `@GeneratedValue(strategy = GenerationType.TABLE, generator = "tableGen")` junto com `@TableGenerator(...)`, que é exatamente o mecanismo pensado para funcionar de modo independente do banco. Em prova, quando aparecer a palavra "portabilidade", desconfie de `IDENTITY` e `SEQUENCE` e pense no gerador por tabela. Obs.: no código da alternativa há pequenos problemas de digitação em alguns nomes de anotações, mas a lógica conceitual cobrada pela banca é essa.