Skip to content

enriquemolinari/taller-jpahibernate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Taller - JPA y Hibernate

Ortogonalidad / Transparencia

  • La persistencia ortogonal significa que el desarrollador puede trabajar con objetos sin preocuparse por cómo se almacenan o recuperan esos objetos de la base de datos. Idealmente no debería hacer nada explícito para persistir.

JPA: Objetos Persistentes

  • ¿Qué es JPA?: Java Persistence API.
    • Hibernate es una implementación de JPA.
    • ORM: Object Relational Mapping. Nos ayuda con las diferencia de impedancia entre el modelo de objetos y el modelo relacional.
    • En Bases de datos Orientadas a Objetos (OODBMS) es todo super transparente, no es necesario mapear.
  • Cuestiones esenciales:
    • En JPA, los objetos persistentes requieren constructores sin argumentos (protected) y setters/getters (privados)
    • Usamos Lombok para simplificar esto que se requiere para JPA.
    • Necesarios para cuando JPA crea las instacias, al recuperarlas de la base de datos.
  • package orm.context: Describe como utilizar EntityManagerFactory, EntityManager y EntityTransaction.
    • Estados: Transient -> Persistent.
  • package orm.mappings: Describe ejempos con los posibles mapeos entre un modelo de objetos un modelo relacional.
    • orm.mappings.manytoone: Relaciones uno a uno y muchos a uno. Solo cambia una restricción de unidad.
    • orm.mappings.onetomany: Es importante usar el JoinColumn para que no genere una tabla intermedia.
    • orm.mappings.componentes: Embebiendo objetos.
    • orm.mappings.manytomanybidireccional: Muchos a muchos bidireccional.
    • orm.mappings.bidireccional: Muchos a muchos bidireccional con datos adicionales en relación.
    • orm.mappings.herecencia: Single Table.
  • package orm.cascade: Describe los diferentes forma de usar persistencia por alcance.
  • package orm.retrieval: Describe las diferentes formas de recuperar objetos persistentes por Id.
    • find() vs getReference()
    • Lazy vs Early: Relaciones uno a muchos o muchos a muchos son lazy por defecto. Cualquier otro caso es early a menos que se especifique lo contrario.
    • Estados: Persistent -> Detached.
  • package orm.queries: JPQL: Java Persistence Query Language

Ciclo de Vida de los Objetos Persistentes

  • Transient: Cuando creo una instancia.
  • Persistent (managed): Cuando la instancia se persistente o se recupera de la base de datos.
  • Detached: Cuando cierro la sesión con la base de datos, las instancias persistenes se convierten en detached.
    • Cualquier cambio sobre estas instancias desatachadas, no se persistiran en la base de datos.
  • Removed: Cuando se elimina una instancia persistente, se marca para ser eliminada de la base de datos.

Data Mapper / Active Record

  • Active Record:

    • Cada clase representa una tabla y contiene métodos para persistir, actualizar y eliminar.
    • No oculta el hecho de que hay una base de datos relacional detrás.
    • Modelo relacional y clases coinciden uno a uno.
    • Modelo de clases y modelo relacional evolucionan de la mano.
    • Eloquent, Rails, Django.
    • Sin persistencia por alcance
  • Data Mapper:

    • Un layer adicional transforma un modelo de objetos en el modelo relacional.
    • Brinda ortogonalidad, transparencia en la persistencia.
    • Modelo de objetos y relacional pueden evolucionar en forma independiente.
    • Hibernate, Doctrine (PHP).
  • Un ejemplo de Eloquent (Laravel) que ilustra el concepto de Active Record:

class User extends Illuminate\Database\Eloquent\Model
{
    // Relación uno-a-muchos
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

class Post extends Illuminate\Database\Eloquent\Model
{
    // Relación muchos-a-uno
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

// Cargo un usuario existente
$user = User::find(1);

// Creo un nuevo post (NO está en la base de datos todavía)
$post = new Post(['title' => 'Nuevo Post']);

// Lo agrego a la colección en memoria
$user->posts->add($post);

// ¿Se persiste el post?
// ❌ No. Esto solo lo agrega a la colección en memoria del objeto $user.
// Si hacés commit o terminas el script, NO queda en la base de datos.

// Para persistirlo, tenés que hacer algo explícito como:
$post->user()->associate($user);
$post->save();

// O usar la relación para crear y persistir en un solo paso:
$user->posts()->save($post);

// O directamente:
$user->posts()->create(['title' => 'Nuevo Post']);

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages