Pular para o conteúdo principal

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:

H2PostgreSQL
Em memória (padrão)Persistente
Desenvolvimento/TestesProdução
Nenhuma instalaçãoInstalação necessária
Dados perdidos ao reiniciarDados persistentes
LeveCompleto 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:

ValorComportamento
noneNenhuma ação
validateValida o schema
updateAtualiza o schema
createCria o schema (drop antes)
create-dropCria 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:

  1. Evite @Data em entidades (problemas com lazy loading)
  2. Exclua relações de equals/hashCode
  3. Use @ToString.Exclude para relações bidirecionais
  4. Prefira @Getter e @Setter separadamente
  5. Atenção ao @EqualsAndHashCode com 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çãoNível
27-30Excelente - Configuração dominada
21-26Bom - Algumas revisões
15-20Médio - Releia os capítulos
Menos de 15Precisa revisar

Voltar ao Módulo 4