# Quiz de la fase 3: El Salto a Spring Boot 3 y APIs REST

> 15 afirmaciones de verdadero o falso, con la respuesta explicada, sobre los días de esta fase del plan JavaMastery.

Versión interactiva: https://aprende-java.webs-economicas.es/quiz/fase-3/

## Afirmaciones

### 1. Spring Boot 3 requiere como mínimo Java 17.

**Respuesta:** Verdadero. Spring Framework 6, su base, exige Java 17 como versión mínima.

**Para recordarlo:** Spring Boot 3 = Spring 6 = Java 17 como mínimo.

Se estudia en el [día 12: El Contenedor de Beans de Spring Boot 3 e Inyección Idiomática](https://aprende-java.webs-economicas.es/dias/spring-boot-beans-inyeccion.md).

### 2. Spring Boot 3 sigue usando los paquetes `javax.persistence` y `javax.servlet`.

**Respuesta:** Falso. Migró a Jakarta EE 9+, así que los paquetes pasan a ser `jakarta.persistence` y `jakarta.servlet`.

**Para recordarlo:** En Boot 3, si ves `javax.persistence` o `javax.servlet`, cámbialo por `jakarta.*`.

Se estudia en el [día 12: El Contenedor de Beans de Spring Boot 3 e Inyección Idiomática](https://aprende-java.webs-economicas.es/dias/spring-boot-beans-inyeccion.md).

### 3. Si una clase tiene un único constructor, Spring lo usa para inyectar sin necesidad de `@Autowired`.

**Respuesta:** Verdadero. Desde Spring 4.3 la anotación es opcional en ese caso, así que el estilo idiomático es omitirla.

**Para recordarlo:** Un constructor = sin `@Autowired`. Solo hace falta si hay varios y quieres elegir uno.

Se estudia en el [día 12: El Contenedor de Beans de Spring Boot 3 e Inyección Idiomática](https://aprende-java.webs-economicas.es/dias/spring-boot-beans-inyeccion.md).

### 4. Por defecto, cada bean de Spring es un singleton dentro del `ApplicationContext`.

**Respuesta:** Verdadero. El scope por defecto es `singleton`: una instancia por contexto. Por eso los beans no deben guardar estado de cada petición.

**Para recordarlo:** Beans singleton: nada de guardar en sus campos datos de una petición concreta.

Se estudia en el [día 12: El Contenedor de Beans de Spring Boot 3 e Inyección Idiomática](https://aprende-java.webs-economicas.es/dias/spring-boot-beans-inyeccion.md).

### 5. `ProblemDetail` sigue el formato estándar de errores HTTP de la RFC 7807, actualizada por la RFC 9457.

**Respuesta:** Verdadero. Devuelve `application/problem+json` con `type`, `title`, `status`, `detail` e `instance`.

**Para recordarlo:** Errores HTTP con forma estándar: `ProblemDetail` y `application/problem+json`.

Se estudia en el [día 13: APIs REST Robustas: DTOs con Records y ProblemDetail RFC 7807](https://aprende-java.webs-economicas.es/dias/apis-rest-dtos-problemdetail.md).

### 6. Al crear un recurso con POST, lo correcto es responder `200 OK` sin cabecera `Location`.

**Respuesta:** Falso. Lo semántico es `201 Created` con una cabecera `Location` que apunte al nuevo recurso.

**Para recordarlo:** Crear = `201 Created` + `Location`. Leer = `200`. Borrar sin cuerpo = `204`.

Se estudia en el [día 13: APIs REST Robustas: DTOs con Records y ProblemDetail RFC 7807](https://aprende-java.webs-economicas.es/dias/apis-rest-dtos-problemdetail.md).

### 7. Poner `@Valid` en un parámetro `@RequestBody` hace que se valide antes de ejecutar el método del controlador.

**Respuesta:** Verdadero. Si la validación falla, Spring lanza `MethodArgumentNotValidException` y el método no llega a ejecutarse.

**Para recordarlo:** Sin `@Valid`, las anotaciones de validación del DTO no hacen nada.

Se estudia en el [día 13: APIs REST Robustas: DTOs con Records y ProblemDetail RFC 7807](https://aprende-java.webs-economicas.es/dias/apis-rest-dtos-problemdetail.md).

### 8. Dentro de una transacción, si modificas una entidad gestionada, el cambio se guarda al hacer commit aunque no llames a `save()`.

**Respuesta:** Verdadero. Es el dirty checking de Hibernate: al hacer flush compara las entidades con su estado original y genera los `UPDATE`.

**Para recordarlo:** Entidad gestionada + transacción = los cambios se guardan solos al hacer commit.

Se estudia en el [día 14: Spring Data JPA e Hibernate: Automatizando la Persistencia](https://aprende-java.webs-economicas.es/dias/spring-data-jpa-hibernate.md).

### 9. Si un método llama a otro método `@Transactional` de la misma clase, se abre una transacción nueva.

**Respuesta:** Falso. La llamada no pasa por el proxy de Spring (autoinvocación), así que la anotación del método llamado se ignora.

**Para recordarlo:** `@Transactional` funciona a través del proxy: las llamadas internas (`this.metodo()`) no pasan por él.

Se estudia en el [día 14: Spring Data JPA e Hibernate: Automatizando la Persistencia](https://aprende-java.webs-economicas.es/dias/spring-data-jpa-hibernate.md).

### 10. Los records son una buena opción para modelar entidades JPA.

**Respuesta:** Falso. JPA necesita un constructor sin argumentos, campos que se puedan modificar y clases que admitan proxies. Los records encajan como DTOs o proyecciones.

**Para recordarlo:** Records para DTOs y proyecciones; clases normales para entidades JPA.

Se estudia en el [día 14: Spring Data JPA e Hibernate: Automatizando la Persistencia](https://aprende-java.webs-economicas.es/dias/spring-data-jpa-hibernate.md).

### 11. `spring.jpa.hibernate.ddl-auto=update` es la forma recomendada de gestionar el esquema en producción.

**Respuesta:** Falso. No versiona los cambios, no borra ni renombra columnas de forma fiable y puede dejar el esquema a medias. En producción se usan migraciones con Flyway o Liquibase.

**Para recordarlo:** En producción, `ddl-auto=validate` y migraciones con Flyway o Liquibase.

Se estudia en el [día 14: Spring Data JPA e Hibernate: Automatizando la Persistencia](https://aprende-java.webs-economicas.es/dias/spring-data-jpa-hibernate.md).

### 12. `@ManyToOne` es LAZY por defecto.

**Respuesta:** Falso. `@ManyToOne` y `@OneToOne` son EAGER por defecto; `@OneToMany` y `@ManyToMany`, LAZY. Por eso conviene marcar siempre las `*ToOne` con `fetch = FetchType.LAZY`.

**Para recordarlo:** Regla fácil: todas las relaciones, LAZY; carga lo necesario en cada consulta.

Se estudia en el [día 15: JPA en Producción: Relaciones, N+1, Paginación y Migraciones](https://aprende-java.webs-economicas.es/dias/jpa-produccion-n-1-paginacion-migraciones.md).

### 13. El problema N+1 se soluciona poniendo todas las relaciones en EAGER.

**Respuesta:** Falso. EAGER carga las relaciones en todas las consultas aunque no se usen, y con colecciones puede seguir lanzando una consulta por elemento. Se soluciona con `JOIN FETCH`, `@EntityGraph` o proyecciones.

**Para recordarlo:** N+1: pide los datos juntos en esa consulta; no cambies el tipo de carga global.

Se estudia en el [día 15: JPA en Producción: Relaciones, N+1, Paginación y Migraciones](https://aprende-java.webs-economicas.es/dias/jpa-produccion-n-1-paginacion-migraciones.md).

### 14. En una relación bidireccional, Hibernate escribe la clave foránea mirando el lado que tiene `mappedBy`.

**Respuesta:** Falso. `mappedBy` marca el lado inverso, que Hibernate ignora al escribir. La clave foránea sale del lado propietario, normalmente el `@ManyToOne`.

**Para recordarlo:** `mappedBy` = «la relación está mapeada en el otro lado»: el que manda es el otro.

Se estudia en el [día 15: JPA en Producción: Relaciones, N+1, Paginación y Migraciones](https://aprende-java.webs-economicas.es/dias/jpa-produccion-n-1-paginacion-migraciones.md).

### 15. Si un repositorio devuelve `Slice<T>` en lugar de `Page<T>`, Spring Data se ahorra la consulta `count`.

**Respuesta:** Verdadero. `Slice` solo sabe si hay página siguiente (pide un elemento de más); `Page` necesita el total y lanza una consulta extra de recuento.

**Para recordarlo:** ¿Necesitas el total de páginas? `Page`. ¿Solo «cargar más»? `Slice`.

Se estudia en el [día 15: JPA en Producción: Relaciones, N+1, Paginación y Migraciones](https://aprende-java.webs-economicas.es/dias/jpa-produccion-n-1-paginacion-migraciones.md).

