Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Arquitetura Java: Uma Visão Pragmática Para Desenvolvedores

Arquitetura Java: Uma Visão Pragmática Para Desenvolvedores

(Palestra ministrada na UNIPÊ na abertura do MBA: ARQUITETURA E SOLUÇÕES DE TI em JUL-2017)

Quando se fala em arquitetura de sistemas Java é muito comum se pensar apenas em quais frameworks e tecnologias que serão utilizados, mas a verdade é que definir a arquitetura de sistemas vai muito além disso.

É preciso entender o contexto na qual o projeto e empresa estão inseridos, os pre-requisitos não-funcionais e até mesmo conhecer a equipe de perto. A partir daí devemos analisar os trade-offs de cada tecnologia ou ferramenta escolhida e ver se ela se adequa ao nosso sistema, sem nunca esquecer que aspectos como implementação e design de classes importam.

Por fim, discutiremos o verdadeiro papel de um arquiteto dentro das empresas.

Rafael Ponte

July 05, 2017
Tweet

More Decks by Rafael Ponte

Other Decks in Technology

Transcript

  1. requisição C A V resposta M (empurra dados) MVC Push

    Struts Spring MVC VRaptor Ruby On Rails Laravel .Net MVC
  2. public class Produto { private Integer id; private String nome;

    private String descricao; private Double preco; private List<Categoria> categorias; }
  3. public class Produto { private Integer produtoId; private String produtoNome;

    private String produtoDescricao; private Double produtoPreco; private List<Categoria> categorias; }
  4. public class Produto { private Integer produtoId; private String produtoNome;

    private String produtoDescricao; private Double produtoPreco; private List<Categoria> categorias; }
  5. public class Produto { private Integer produtoId; private String produtoNome;

    private String produtoDescricao; private Double produtoPreco; private List<Categoria> categorias; }
  6. public class Produto { private Integer produtoId; private String produtoNome;

    private String produtoDescricao; private Double produtoPreco; private List<Categoria> categorias; }
  7. public class Produto { private Integer produtoId; private String produtoNome;

    private String produtoDescricao; private Double produtoPreco; private List<Categoria> categorias; }
  8. public class Produto { private Integer produtoId; private String produtoNome;

    private String produtoDescricao; private Double produtoPreco; private List<Categoria> categorias; }
  9. public class Produto { private Integer id; private String nome;

    private String descricao; private Double preco; private List<Categoria> tags; }
  10. public class Produto { private Integer id; private String nome;

    private String descricao; private Double preco; private List<Categoria> tags; }
  11. public class Produto { private Integer id; private String nome;

    private String descricao; private Double preco; private List<Categoria> tags; }
  12. public class Produto { private Integer id; private String nome;

    private String descricao; private Double preco; private List<Categoria> tags; }
  13. public class Produto { private Integer id; private String nome;

    private String descricao; private Double preco; private List<Categoria> categorias; }
  14. class Produto { ... } class Cliente { ... }

    class Venda { ... } class Pagamento { ... } class Parcela { ... } class Imposto { ... } class Frete { ... }
  15. public class FinalizaVenda { private void finaliza(Venda venda) { //

    grava venda no banco // baixa no estoque dos produtos // efetua pagamento // envia email para cliente } }
  16. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  17. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  18. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  19. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  20. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  21. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  22. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  23. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  24. public class ProdutoDao { void adiciona(Produto produto) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_PRODUTO(nome,desc,preco) VALUES (?,?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, produto.getNome()); ps.setString(2, produto.getDescricao()); ps.setDouble(3, produto.getPreco()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  25. public class ClienteDao { void adiciona(Cliente cliente) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_CLIENTE(nome,cpf) VALUES (?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, cliente.getNome()); ps.setString(2, cliente.getCpf()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  26. public class ClienteDao { void adiciona(Cliente cliente) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_CLIENTE(nome,cpf) VALUES (?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, cliente.getNome()); ps.setString(2, cliente.getCpf()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  27. public class ClienteDao { void adiciona(Cliente cliente) { Connection c

    = // cria conexão com banco String sql = "INSERT INTO TB_CLIENTE(nome,cpf) VALUES (?,?)"; PreparedStatement ps = c.prepareStatment(sql); ps.setString(1, cliente.getNome()); ps.setString(2, cliente.getCpf()); ps.execute(); // executa sql c.close(); // fecha conexão } }
  28. public class ClienteDao { List<Cliente> lista() { List<Cliente> clientes =

    new ArrayList<>(); Connection c = // cria conexão com banco String sql = “select nome, cpf from TB_CLIENTE”; PreparedStatement ps = c.prepareStatment(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { Cliente cliente = new Cliente(); cliente.setNome(rs.getString(“nome”)); cliente.setcpf(rs.getString(“cpf”)); clientes.add(cliente);
 } return clientes; }
  29. public class ClienteDao { List<Cliente> lista() { List<Cliente> clientes =

    new ArrayList<>(); Connection c = // cria conexão com banco String sql = “select nome, cpf from TB_CLIENTE”; PreparedStatement ps = c.prepareStatment(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { Cliente cliente = new Cliente(); cliente.setNome(rs.getString(“nome”)); cliente.setcpf(rs.getString(“cpf”)); clientes.add(cliente);
 } return clientes; }
  30. public class ClienteDao { List<Cliente> lista() { List<Cliente> clientes =

    new ArrayList<>(); Connection c = // cria conexão com banco String sql = “select nome, cpf from TB_CLIENTE”; PreparedStatement ps = c.prepareStatment(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { Cliente cliente = new Cliente(); cliente.setNome(rs.getString(“nome”)); cliente.setcpf(rs.getString(“cpf”)); clientes.add(cliente);
 } return clientes; }
  31. public class ClienteDao { List<Cliente> lista() { List<Cliente> clientes =

    new ArrayList<>(); Connection c = // cria conexão com banco String sql = “select nome, cpf from TB_CLIENTE”; PreparedStatement ps = c.prepareStatment(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { Cliente cliente = new Cliente(); cliente.setNome(rs.getString(“nome”)); cliente.setcpf(rs.getString(“cpf”)); clientes.add(cliente);
 } return clientes; }
  32. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins
  33. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins
  34. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins
  35. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins
  36. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins
  37. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins conexao.salva(produto)
  38. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins conexao.salva(produto) ORM
 (Object Relational Mapping)
  39. Paradigma Relacional Paradigma OO classes atributos objetos herança associação encapsulamento

    polimorfismo tabelas colunas tuplas primary keys foreign keys constraints joins conexao.salva(produto)
  40. @Entity @Table(name="TB_PRODUTO") public class Produto { @Id private Integer id;

    private String nome; private String descricao; @Column(name="VALOR") private Double preco; }
  41. @Entity public class Produto { @Id @GeneratedValue private Integer id;

    private String nome; private String descricao; @Column(name="VALOR") private Double preco; }
  42. @Entity public class Produto { @Id private Integer id; private

    String nome; private String descricao; @Column(name="VALOR") private Double preco; }
  43. @Entity public class Produto { @Id @GeneratedValue private Integer id;

    private String nome; private String descricao; @Column(name="VALOR") private Double preco; }
  44. @Entity @Table(name="TB_PRODUTO") public class Produto { @Id @GeneratedValue private Integer

    id; private String nome; private String descricao; @Column(name="VALOR") private Double preco; }
  45. @Entity @Table(name="TB_PRODUTO") public class Produto { @Id @GeneratedValue private Integer

    id; private String nome; private String descricao; @Column(name=“VALOR") private Double preco; }
  46. public class ProdutoDao { void adiciona(Produto produto) { EntityManager manager

    = // cria conexão manager.getTransaction().begin(); manager.persist(produto); manager.getTransaction().commit(); } }
  47. public class ProdutoDao { void adiciona(Produto produto) { EntityManager manager

    = // cria conexão manager.getTransaction().begin(); manager.persist(produto); manager.getTransaction().commit(); } }
  48. public class ProdutoDao { void adiciona(Produto produto) { EntityManager manager

    = // cria conexão manager.getTransaction().begin(); manager.persist(produto); manager.getTransaction().commit(); } }
  49. public class ProdutoDao { void adiciona(Produto produto) { EntityManager manager

    = // cria conexão manager.getTransaction().begin(); manager.persist(produto); manager.getTransaction().commit(); } }
  50. public class ProdutoDao { void adiciona(Produto produto) { EntityManager manager

    = // cria conexão manager.getTransaction().begin(); manager.persist(produto); manager.getTransaction().commit(); } }
  51. SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID

    = BOOK.AUTHOR_ID WHERE BOOK.LANGUAGE = 'DE' AND BOOK.PUBLISHED > DATE '2008-01-01' GROUP BY AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME HAVING COUNT(*) > 5 ORDER BY AUTHOR.LAST_NAME ASC NULLS FIRST LIMIT 2 OFFSET 1 SQL
  52. public class ProdutoDao { void adiciona(Produto produto) { EntityManager manager

    = // cria conexão manager.getTransaction().begin(); manager.persist(produto); manager.getTransaction().commit(); } }
  53. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  54. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  55. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  56. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  57. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  58. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  59. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  60. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  61. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  62. public class ProdutoDao { void adiciona(Produto produto) { EntityManager em

    = new JpaUtil().getEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } }
  63. public class ProdutoDao { private EntityManager em; public ProdutoDao(EntityManager em)

    { this.em = em; } void adiciona(Produto produto) { EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { // restante do codigo } finally { if (em != null) { em.close(); } } }
  64. public class ProdutoDao { private EntityManager em; public ProdutoDao(EntityManager em)

    { this.em = em; } void adiciona(Produto produto) { EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { // restante do codigo } finally { if (em != null) { em.close(); } } }
  65. public class ProdutoDao { private EntityManager em; public ProdutoDao(EntityManager em)

    { this.em = em; } void adiciona(Produto produto) { EntityTransaction tx = em.getTransaction(); try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { // restante do codigo } finally { if (em != null) { em.close(); } } }
  66. @ManagedBean public class ProdutoBean { public void grava(Produto produto) {

    ProdutoDao dao = new ProdutoDao(); dao.adiciona(produto); // restante do código } } JSF
  67. @ManagedBean public class ProdutoBean { public void grava(Produto produto) {

    ProdutoDao dao = new ProdutoDao(); dao.adiciona(produto); // restante do código } } JSF
  68. JSF @ManagedBean public class ProdutoBean { public void grava(Produto produto)

    { ProdutoDao dao = new ProdutoDao(); dao.adiciona(produto); // restante do código } } Não compila!
  69. @ManagedBean public class ProdutoBean { public void grava(Produto produto) {

    EntityManager em = new JpaUtil().getEM(); ProdutoDao dao = new ProdutoDao(em); dao.adiciona(produto); // restante do código } } JSF
  70. JSF @ManagedBean public class ProdutoBean { public void grava(Produto produto)

    { EntityManager em = new JpaUtil().getEM(); ProdutoDao dao = new ProdutoDao(em); dao.adiciona(produto); // restante do código } }
  71. JSF @ManagedBean public class ProdutoBean { public void grava(Produto produto)

    { EntityManager em = new JpaUtil().getEM(); ProdutoDao dao = new ProdutoDao(em); dao.adiciona(produto); // restante do código } }
  72. JSF @ManagedBean public class ProdutoBean { public void grava(Produto produto)

    { EntityManager em = new JpaUtil().getEM(); ProdutoDao dao = new ProdutoDao(em); dao.adiciona(produto); // restante do código } }
  73. @ManagedBean public class ProdutoBean { public void grava(Produto produto) {

    EntityManager em = new JpaUtil().getEM(); ProdutoDao dao = new ProdutoDao(em); dao.adiciona(produto); // restante do código } } JSF
  74. @ManagedBean public class ProdutoBean { public void grava(Produto produto) {

    EntityManager em = new JpaUtil().getEM(); ProdutoDao dao = new ProdutoDao(em); dao.adiciona(produto); // restante do código } } JSF
  75. @ManagedBean public class ProdutoBean { private ProdutoDao dao public void

    grava(Produto produto) { dao.adiciona(produto); // restante do código } } JSF
  76. @ManagedBean public class ProdutoBean { private ProdutoDao dao public void

    grava(Produto produto) { dao.adiciona(produto); // restante do código } } JSF Injeta Spring!
  77. @ManagedBean public class ProdutoBean { private ProdutoDao dao public void

    grava(Produto produto) { dao.adiciona(produto); // restante do código } } JSF
  78. @Controller public class ProdutoBean { private ProdutoDao dao public void

    grava(Produto produto) { dao.adiciona(produto); // restante do código } } JSF
  79. @Controller public class ProdutoBean { @Autowired private ProdutoDao dao public

    void grava(Produto produto) { dao.adiciona(produto); // restante do código } } JSF
  80. @Controller public class ProdutoBean { @Autowired private ProdutoDao dao public

    void grava(Produto produto) { dao.adiciona(produto); // restante do código } } JSF Quem contrala?
  81. @Repository public class ProdutoDao { private EntityManager em; public ProdutoDao(EntityManager

    em) { this.em = em; } void adiciona(Produto produto) { // ... } }
  82. @Repository public class ProdutoDao { private EntityManager em; public ProdutoDao(EntityManager

    em) { this.em = em; } void adiciona(Produto produto) { // ... } }
  83. @Repository public class ProdutoDao { private EntityManager em; public ProdutoDao(EntityManager

    em) { this.em = em; } void adiciona(Produto produto) { // ... } } Injeta Spring!
  84. @Repository public class ProdutoDao { private EntityManager em; @Autowired public

    ProdutoDao(EntityManager em) { this.em = em; } void adiciona(Produto produto) { // ... } }
  85. @Repository public class ProdutoDao { private EntityManager em; @Autowired public

    ProdutoDao(EntityManager em) { this.em = em; } void adiciona(Produto produto) { // ... } } Quem controla?
  86. @Repository public class ProdutoDao { private EntityManager em; @Autowired public

    ProdutoDao(EntityManager em) { this.em = em; } void adiciona(Produto produto) { // ... } } JPA/Hibernate
  87. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; @Autowired

    public ProdutoDao(EntityManager em) { this.em = em; } void adiciona(Produto produto) { // ... } }
  88. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; @Autowired

    public ProdutoDao(EntityManager em) { this.em = em; } void adiciona(Produto produto) { // ... } }
  89. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; @Autowired

    public ProdutoDao(EntityManager em) { this.em = em; } void adiciona(Produto produto) { // ... } }
  90. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; void

    adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } }
  91. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; void

    adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } }
  92. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; void

    adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } }
  93. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; void

    adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } É a responsabilidade!
  94. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; void

    adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } } Controle 
 Transacional
  95. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; @Transactional

    void adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } }
  96. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; @Transactional

    void adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } }
  97. @Repository public class ProdutoDao { @PersistenceContext private EntityManager em; @Transactional

    void adiciona(Produto produto) { try { tx.begin(); // inicia transação em.persist(produto); tx.commit(); // comida transação } catch (Exception e) { if (tx != null && tx.isActive()) { tx.rollback(); // desfaz transação } throw new DaoException(e); } finally { if (em != null) { em.close(); } } }