Se solicita información sobre el paradero del estudiante Arshak Karhanyan

Clase 13

Viernes (Noche, 2025)

Resumen

En esta oportunidad seguimos profundizando en los conceptos de ORM y la tecnología JPA/Hibernate:

Mapeo de atributos

Como ya vimos, mapear tipos primitivos (o pseudo primitivos) a columnas es relativamente directo, siempre y cuando los tipos tengan un mapeo natural a la base de datos:

  • LocalDate / LocalDateTime => DATE y TIMESTAMP
  • String => VARCHAR y Text
  • tipos numéricos => INT, LONG, BIGINT, DECIMAL, etc

Aún así, podemos utilizar @Column para personalizar aspectos más sutiles como nombres de columnas, precisión, gestión de nulls, etc.

Por otro lado, las cosas se tornan un poco mas complejas cuando estos atributos representan relaciones con otros objetos de nuestro dominio.

Por un lado, tenemos las relaciones simples, que se representan con OneToOne y ManyToOne, y se traducen a claves foráneas (fks) en la tabla que estamos mapeando. Estas relaciones son por defecto ansiosas (eager), es decir, que al cargar un objeto, también sus relaciones se cargarán. Esto puede ser alterado mediante el atributo fetch (una estrategia lazy traerá proxies de los objetos en lugar de instancias de las clases de dominio).

Por otro lado, tenemos relaciones multiples, que se corresponden a mapeos de colecciones usando OneToMany y ManyToMany. Estos mapeos son diferidos por defecto (lazy). En ambos casos, estas anotaciones generarán tablas intermedias, las cuales pueden ser controladas con @JoinColumn (de hecho, esto en @OneToMany evita la generación de la tabla intermedia) y @JoinTable.

En ocasiones nos toparemos con atributos que no pueden ser mapeados fácilmente a tipos primitivos de la base de datos. Para estos casos tenemos dos opciones:

  • @Convert
  • @Transient

Mapeo de herencia y atributos polimórficos

Además incorporamos el concepto de mapeo de herencia Inheritance y enums (Enumerated): ver acá.

Mencionamos algunos corolarios:

Mapeo de herencia:

  • corolario 1: solo nos importa considerar el mapeo de herencia cuando
    • atributo persistente
    • de una clase persistente
    • tipado con un tipo polimórfico
  • corolario 2:
    • solo la single table TIENE discriminador
  • corolario 3:
    • en Joined, las tablas “hijas” tiene un ID que es tanto PK como FK
  • corolario 4:
    • NO existe el mapeo de polimorfirmo, sólo de herencia
    • Si queremos mapear una interfaz con las mismas restricciones del corolario 1, tenemos que realizar algún tipo de conversión:
      • Opción 1: convertir la interfaz en un enum polimórfico (muy limitada, muy limitante)
      • Opción 2: convertir nuestra interfaz en una clase abstracta (malas noticias: no siempre se puede)

Material

Para la próxima clase