Quiz: Configuração de Banco de Dados
Teste seus conhecimentos sobre PostgreSQL, Hibernate e Lombok.
30 questões - Clique em cada pergunta para revelar a resposta.
Questões 1-10: PostgreSQL
Questão 1: Como adicionar o PostgreSQL a um projeto Spring Boot?
Resposta:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
Questão 2: Como configurar a conexão com o PostgreSQL?
Resposta:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: secret
driver-class-name: org.postgresql.Driver
Questão 3: Como iniciar o PostgreSQL com Docker?
Resposta:
docker run -d \
--name postgres \
-e POSTGRES_DB=mydb \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
postgres:15
Questão 4: Qual a diferença entre H2 e PostgreSQL?
Resposta:
| H2 | PostgreSQL |
|---|---|
| Em memória (padrão) | Persistente |
| Desenvolvimento/Testes | Produção |
| Nenhuma instalação | Instalação necessária |
| Dados perdidos ao reiniciar | Dados persistentes |
| Leve | Completo e robusto |
Questão 5: Como configurar o pool de conexões?
Resposta: O Spring Boot usa HikariCP por padrão:
spring:
datasource:
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
Questão 6: Como definir um schema padrão?
Resposta:
spring:
jpa:
properties:
hibernate:
default_schema: my_schema
Ou na URL:
url: jdbc:postgresql://localhost:5432/mydb?currentSchema=my_schema
Questão 7: Como gerenciar TimeZones com PostgreSQL?
Resposta:
spring:
jpa:
properties:
hibernate:
jdbc:
time_zone: UTC
Recomendado: armazenar em UTC, converter para exibição.
Questão 8: Como configurar SSL para PostgreSQL?
Resposta:
spring:
datasource:
url: jdbc:postgresql://host:5432/db?ssl=true&sslmode=require
Modos: disable, allow, prefer, require, verify-ca, verify-full
Questão 9: Como criar um banco de dados com Docker Compose?
Resposta:
# docker-compose.yml
services:
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
volumes:
postgres-data:
Questão 10: Como externalizar as credenciais do banco de dados?
Resposta:
spring:
datasource:
url: ${DB_URL}
username: ${DB_USER}
password: ${DB_PASSWORD}
Definir as variáveis de ambiente:
export DB_URL=jdbc:postgresql://localhost/mydb
export DB_USER=postgres
export DB_PASSWORD=secret
Questões 11-20: Hibernate DDL
Questão 11: O que é hibernate.ddl-auto?
Resposta: Propriedade que controla a geração automática do schema:
| Valor | Comportamento |
|---|---|
none | Nenhuma ação |
validate | Valida o schema |
update | Atualiza o schema |
create | Cria o schema (drop antes) |
create-drop | Cria e remove ao parar |
Questão 12: Qual valor usar em produção?
Resposta: none ou validate
spring:
jpa:
hibernate:
ddl-auto: validate
Em produção, utilize ferramentas de migração (Flyway, Liquibase).
Questão 13: Como o Hibernate gera os nomes das tabelas?
Resposta: Estratégia padrão: camelCase para snake_case
@Entity
public class UserProfile { }
// Table: user_profile
Personalizar:
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Questão 14: Como especificar o nome de uma tabela?
Resposta:
@Entity
@Table(name = "utilisateurs")
public class User {
// ...
}
Questão 15: Como especificar o nome de uma coluna?
Resposta:
@Entity
public class User {
@Column(name = "nom_complet")
private String fullName;
@Column(name = "courriel", unique = true, nullable = false)
private String email;
}
Questão 16: Como definir uma chave primária auto-gerada?
Resposta:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Estratégias:
// IDENTITY: auto-incremento no BD
// SEQUENCE: sequência no BD
// TABLE: tabela de sequências
// AUTO: escolha automática
Questão 17: Como definir uma restrição única?
Resposta:
// Em uma coluna
@Column(unique = true)
private String email;
// Em várias colunas
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {"firstName", "lastName"})
})
public class User { }
Questão 18: Como definir um índice?
Resposta:
@Entity
@Table(indexes = {
@Index(name = "idx_email", columnList = "email"),
@Index(name = "idx_name", columnList = "lastName, firstName")
})
public class User { }
Questão 19: Como visualizar o SQL gerado pelo Hibernate?
Resposta:
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
logging:
level:
org.hibernate.SQL: DEBUG
org.hibernate.orm.jdbc.bind: TRACE
Questão 20: Como validar o schema na inicialização?
Resposta:
spring:
jpa:
hibernate:
ddl-auto: validate
A aplicação falha na inicialização se o schema não corresponder às entidades.
Questões 21-30: Lombok
Questão 21: O que é Lombok?
Resposta: Biblioteca que gera código repetitivo via anotações:
- Getters/Setters
- Construtores
- equals/hashCode
- toString
- Builder
Reduz consideravelmente o boilerplate.
Questão 22: Como adicionar o Lombok?
Resposta:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
Também instale o plugin na IDE (IntelliJ, Eclipse).
Questão 23: Como gerar getters e setters?
Resposta:
@Getter
@Setter
public class User {
private Long id;
private String name;
}
// Gera:
// getId(), setId()
// getName(), setName()
Questão 24: O que é @Data?
Resposta: Combina várias anotações:
@Data // = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
public class User {
private Long id;
private String name;
}
Questão 25: Como criar um builder?
Resposta:
@Builder
public class User {
private Long id;
private String name;
private String email;
}
// Uso:
User user = User.builder()
.name("John")
.email("john@example.com")
.build();
Questão 26: Como gerar construtores?
Resposta:
@NoArgsConstructor // Construtor vazio
@AllArgsConstructor // Todos os campos
@RequiredArgsConstructor // Campos final e @NonNull
public class User {
private final Long id;
@NonNull
private String name;
private String email;
}
Questão 27: Como usar @Slf4j para logging?
Resposta:
@Slf4j
@Service
public class UserService {
public void process() {
log.info("Processing...");
log.debug("Details: {}", data);
log.error("Error occurred", exception);
}
}
Gera: private static final Logger log = LoggerFactory.getLogger(UserService.class);
Questão 28: Como excluir um campo do toString?
Resposta:
@ToString(exclude = "password")
public class User {
private String email;
private String password; // Excluído do toString
}
// Ou
@ToString.Exclude
private String password;
Questão 29: Como excluir um campo do equals/hashCode?
Resposta:
@EqualsAndHashCode(exclude = "orders")
public class User {
private Long id;
private List<Order> orders; // Excluído
}
// Ou
@EqualsAndHashCode.Exclude
private List<Order> orders;
Questão 30: Quais são as boas práticas com Lombok e JPA?
Resposta:
- Evite
@Dataem entidades (problemas com lazy loading) - Exclua relações de equals/hashCode
- Use
@ToString.Excludepara relações bidirecionais - Prefira
@Gettere@Setterseparadamente - Atenção ao
@EqualsAndHashCodecom entidades
@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString(exclude = "orders")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class User {
@Id
@EqualsAndHashCode.Include
private Long id;
@OneToMany(mappedBy = "user")
private List<Order> orders;
}
Pontuação
| Pontuação | Nível |
|---|---|
| 27-30 | Excelente - Configuração dominada |
| 21-26 | Bom - Algumas revisões |
| 15-20 | Médio - Releia os capítulos |
| Menos de 15 | Precisa revisar |