Persistência
no JAVA
- Hibernate e JPA -



       Sérgio Lopes - @sergio_caelum
          sergio.lopes@caelum.com.br
Como você grava no seu
       banco de dados?
mysql
código
acessando via C
/* Connect to database */
 if (!mysql_real_connect(conn, server,
       user, password, database, 0, NULL, 0)) {
    fprintf(stderr, "%sn", mysql_error(conn));
    exit(1);
 }

 /* send SQL query */
 if (mysql_query(conn, "show tables")) {
    fprintf(stderr, "%sn", mysql_error(conn));
    exit(1);
 }

 res = mysql_use_result(conn);

 /* output table name */
 printf("MySQL Tables in mysql database:n");
 while ((row = mysql_fetch_row(res)) != NULL)
    printf("%s n", row[0]);
Considerações


• +Performance
• -Manutenção
lib_mysql                                      ???



            Vamos ver código dessa evolução!
código java   JDBC   driver   mysql
acessando via JDBC
try
      {
          String userName = "testuser";
          String password = "testpass";
          String url = "jdbc:mysql://localhost/test";
          Class.forName ("com.mysql.jdbc.Driver").newInstance ();
          conn = DriverManager.getConnection (url, userName, password);
          System.out.println ("Database connection established");
      }
      catch (Exception e)
      {
          System.err.println ("Cannot connect to database server");
      }
      finally
      {
          if (conn != null)
          {
              try
              {
                  conn.close ();
                  System.out.println ("Database connection terminated");
              }
              catch (Exception e) { /* ignore close errors */ }
          }
      }
Considerações

• ++Extensibilidade
• +Manutenção
• -Performance
código java   Hibernate   JDBC   driver   mysql




     Mapeamento Objeto/Relacional (ORM)
acessando via Hibernate


Livro livro = new Livro();
session.save(livro);
Considerações

• ++Extensibilidade
• +Manutenção
• -Performance
Livro l = new Livro();
l.setNome("Alice no País das Maravilhas");
l.setDescricao("Um excelente livro");

Session session = //....
session.beginTransaction();
session.save(l);
session.getTransaction().commit();
Livro l = new Livro();
l.setNome("Alice no País das Maravilhas");
l.setDescricao("Um excelente livro");

Session session = //....
session.beginTransaction();
session.save(l);
session.getTransaction().commit();
Livro l = new Livro();
l.setNome("Alice no País das Maravilhas");
l.setDescricao("Um excelente livro");

Session session = //....
session.beginTransaction();
session.save(l);
session.getTransaction().commit();
Livro l = new Livro();
l.setNome("Alice no País das Maravilhas");
l.setDescricao("Um excelente livro");

Session session = //....
session.beginTransaction();
session.save(l);
session.getTransaction().commit();
Livro l = new Livro();
l.setNome("Alice no País das Maravilhas");
l.setDescricao("Um excelente livro");

Autor a = new Autor();
a.setNome("Lewis");
a.setSobrenome("Carroll");

l.setAutor(a);

Session session = //....
session.beginTransaction();
session.save(a);
session.save(l);
session.getTransaction().commit();
código java   Hibernate   JDBC   driver   mysql
Hibernate
                 TopLink
código java JPA OpenJPA      JDBC driver   mysql
                EclipseLin
                     k
Hibernate
                 TopLink
código java JPA OpenJPA      JDBC driver   mysql
                EclipseLin
                     k
Hibernate
                 TopLink
código java JPA OpenJPA      JDBC driver    mysql
                EclipseLin
                     k



     Abstraindo a abstração da abstração!
                   Socorro!
acessando via JPA


Livro livro = new Livro();
manager.persist(livro);



          Migrar de Hibernate -> JPA?
Problemas


• Mais uma camada!
• Não tem tudo do Hibernate
lib_mysql   jdbc   hibernate   jpa   ???
seu BD é a prova de balas?
seu BD é a prova de balas?
Relational DBs
-   Seguro
-   Consistente
-   Integro
-   Relacional
NO RELATIONAL
relational DBs
-   rapido
-   escalavel
-   SIMPLES
-   confiavel?
Migrando para o
Google App Engine!
BigTable API
// Get a handle on the datastore itself
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

// Lookup data by known key name
Entity userEntity = datastore.get(KeyFactory.createKey("UserInfo", email));

// Or perform a query
Query query = new Query("Task", userEntity);
query.addFilter("dueDate", Query.FilterOperator.LESS_THAN, today);
for (Entity taskEntity : datastore.prepare(query).asIterable()) {
  if ("done".equals(taskEntity.getProperty("status"))) {
    datastore.delete(taskEntity);
  } else {
    taskEntity.setProperty("status", "overdue");
    datastore.put(taskEntity);
  }
}



                                      “só” aprender mais uma API!
#
JPA para BigTable #FTW


<provider>
  org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider
</provider>
Acessando BigTable com JPA


   Livro livro = new Livro();
   manager.persist(livro);
Tá migrado!
Conclusão

• SQL queries difíceis
• ORM para o dia a dia
• NoSQL para escalabilidade, disponibilidade
• libC para insanidade
• Java sempre :)
Obrigado!

  Sérgio Lopes - @sergio_caelum
     sergio.lopes@caelum.com.br
FJ-11   Java e Orientação a Objetos


        Laboratório Java com testes,
FJ-16        XML e Design Patterns


FJ-21   Java para desenvolvimento Web


        Preparatório para certificação
FJ-19            de programador Java


FJ-25   Persistência com JPA2 e Hibernate


FJ-26   Laboratório Web com JSF2 e CDI


FJ-31   Java EE avançado e Web Services

Persistência Java: Hibernate e JPA

  • 1.
    Persistência no JAVA - Hibernatee JPA - Sérgio Lopes - @sergio_caelum sergio.lopes@caelum.com.br
  • 2.
    Como você gravano seu banco de dados?
  • 3.
  • 4.
    acessando via C /*Connect to database */ if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { fprintf(stderr, "%sn", mysql_error(conn)); exit(1); } /* send SQL query */ if (mysql_query(conn, "show tables")) { fprintf(stderr, "%sn", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); /* output table name */ printf("MySQL Tables in mysql database:n"); while ((row = mysql_fetch_row(res)) != NULL) printf("%s n", row[0]);
  • 5.
  • 6.
    lib_mysql ??? Vamos ver código dessa evolução!
  • 7.
    código java JDBC driver mysql
  • 8.
    acessando via JDBC try { String userName = "testuser"; String password = "testpass"; String url = "jdbc:mysql://localhost/test"; Class.forName ("com.mysql.jdbc.Driver").newInstance (); conn = DriverManager.getConnection (url, userName, password); System.out.println ("Database connection established"); } catch (Exception e) { System.err.println ("Cannot connect to database server"); } finally { if (conn != null) { try { conn.close (); System.out.println ("Database connection terminated"); } catch (Exception e) { /* ignore close errors */ } } }
  • 9.
  • 10.
    código java Hibernate JDBC driver mysql Mapeamento Objeto/Relacional (ORM)
  • 11.
    acessando via Hibernate Livrolivro = new Livro(); session.save(livro);
  • 12.
  • 18.
    Livro l =new Livro(); l.setNome("Alice no País das Maravilhas"); l.setDescricao("Um excelente livro"); Session session = //.... session.beginTransaction(); session.save(l); session.getTransaction().commit();
  • 19.
    Livro l =new Livro(); l.setNome("Alice no País das Maravilhas"); l.setDescricao("Um excelente livro"); Session session = //.... session.beginTransaction(); session.save(l); session.getTransaction().commit();
  • 20.
    Livro l =new Livro(); l.setNome("Alice no País das Maravilhas"); l.setDescricao("Um excelente livro"); Session session = //.... session.beginTransaction(); session.save(l); session.getTransaction().commit();
  • 21.
    Livro l =new Livro(); l.setNome("Alice no País das Maravilhas"); l.setDescricao("Um excelente livro"); Session session = //.... session.beginTransaction(); session.save(l); session.getTransaction().commit();
  • 25.
    Livro l =new Livro(); l.setNome("Alice no País das Maravilhas"); l.setDescricao("Um excelente livro"); Autor a = new Autor(); a.setNome("Lewis"); a.setSobrenome("Carroll"); l.setAutor(a); Session session = //.... session.beginTransaction(); session.save(a); session.save(l); session.getTransaction().commit();
  • 28.
    código java Hibernate JDBC driver mysql
  • 29.
    Hibernate TopLink código java JPA OpenJPA JDBC driver mysql EclipseLin k
  • 30.
    Hibernate TopLink código java JPA OpenJPA JDBC driver mysql EclipseLin k
  • 31.
    Hibernate TopLink código java JPA OpenJPA JDBC driver mysql EclipseLin k Abstraindo a abstração da abstração! Socorro!
  • 32.
    acessando via JPA Livrolivro = new Livro(); manager.persist(livro); Migrar de Hibernate -> JPA?
  • 33.
    Problemas • Mais umacamada! • Não tem tudo do Hibernate
  • 34.
    lib_mysql jdbc hibernate jpa ???
  • 35.
    seu BD éa prova de balas?
  • 36.
    seu BD éa prova de balas?
  • 37.
    Relational DBs - Seguro - Consistente - Integro - Relacional
  • 38.
    NO RELATIONAL relational DBs - rapido - escalavel - SIMPLES - confiavel?
  • 39.
  • 40.
    BigTable API // Geta handle on the datastore itself DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); // Lookup data by known key name Entity userEntity = datastore.get(KeyFactory.createKey("UserInfo", email)); // Or perform a query Query query = new Query("Task", userEntity); query.addFilter("dueDate", Query.FilterOperator.LESS_THAN, today); for (Entity taskEntity : datastore.prepare(query).asIterable()) { if ("done".equals(taskEntity.getProperty("status"))) { datastore.delete(taskEntity); } else { taskEntity.setProperty("status", "overdue"); datastore.put(taskEntity); } } “só” aprender mais uma API!
  • 41.
  • 42.
    JPA para BigTable#FTW <provider> org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider </provider>
  • 43.
    Acessando BigTable comJPA Livro livro = new Livro(); manager.persist(livro);
  • 44.
  • 45.
    Conclusão • SQL queriesdifíceis • ORM para o dia a dia • NoSQL para escalabilidade, disponibilidade • libC para insanidade • Java sempre :)
  • 46.
    Obrigado! SérgioLopes - @sergio_caelum sergio.lopes@caelum.com.br
  • 47.
    FJ-11 Java e Orientação a Objetos Laboratório Java com testes, FJ-16 XML e Design Patterns FJ-21 Java para desenvolvimento Web Preparatório para certificação FJ-19 de programador Java FJ-25 Persistência com JPA2 e Hibernate FJ-26 Laboratório Web com JSF2 e CDI FJ-31 Java EE avançado e Web Services