Problema no botão excluir usando hibernate

Java

28/05/2013

Através de uma tabela, clico duas vezes sobre um registro contido nela e ele vai para a tela de cadastro, mostrando todos os dados. Nessa aba, tenho um botão remover... Quando clico não dá nenhum erro, mas também não exclui. O que posso fazer? Sou grato por qualquer ajuda!

JButton btnRemover = new JButton("Remover");
		btnRemover.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\delete.png"));
		btnRemover.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(arg0.getClickCount() == 2){
					int linha = table.getSelectedRow();
					if(linha != -1) {
						int idSelecionado = (Integer) table.getValueAt(linha, 0);
						EntityManager manager = EntityManagerUtil.getManager();
						manager.getTransaction().begin();
						Empresa em = manager.find(Empresa.class, idSelecionado);
						if(em != null) {
							 Empresa empresa = manager.find(Empresa.class, idSelecionado);
						     Endereco e = manager.find(Endereco.class, idSelecionado);
							 
							 manager.remove(em);
							 manager.remove(e);
							
							
							System.out.println(em.getNome());
							tabbedPane.setSelectedIndex(0);
						} else {
							System.out.println("empresa não selecionada");
						}
						manager.getTransaction().commit();
						manager.close();
					} else {
						System.out.println("nenhuma linha");
					}
				} else{
					System.out.println("qtd click: "  + arg0.getClickCount() );
				}
			}
				
			
		}
Andreiv Araújo

Andreiv Araújo

Curtidas 0

Respostas

Rafael Benetti

Rafael Benetti

28/05/2013

Vode nao quer postar a tua Classe JFrame e os Services ou DAO (nao sei como voce esta fazendo)
do services o dao se puder passar os metodos principais(eliminar)

ai eu posso ter uma visao maior de que problema voce pode estar tendo...

depois de eliminar voce ja tentou entrar no JFrame e os dados continuao la???

abracos!!!
GOSTEI 0
Andreiv Araújo

Andreiv Araújo

28/05/2013

package br.com.andreiv.jobs.gui;

import java.awt.EventQueue;

public class TelaEmpresas extends JInternalFrame {
	private JTextField txtNome;
	private JTextField txtCnpj;
	private JTextField txtRamo;
	private JTextField txtEmail;
	private JTextField txtTelefone;
	private JTextField txtRua;
	private JTextField txtNumero;
	private JTextField txtCidade;
	private JTextField txtBairro;
	private JTextField txtEstado;
	private JTextField txtPais;
	private JTabbedPane tabbedPane;
	private JTable table;
	private JTextField txtId;



	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TelaEmpresas frame = new TelaEmpresas();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TelaEmpresas() {
		setClosable(true);
		setTitle("Manuten\u00E7\u00E3o de Empresas");
		setFrameIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\building_add.png"));
		setBounds(100, 100, 502, 412);
		
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		tabbedPane.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent arg0) {
				if(tabbedPane.getSelectedIndex() == 1){
					 Query query = EntityManagerUtil.getManager().createQuery("SELECT em FROM Empresa em");
					 List <Empresa> empresas = query.getResultList();
					 EmpresasTableModel modelo = (EmpresasTableModel) table.getModel();
					 modelo.limpar();
					 for(Empresa em : empresas) {
						 modelo.adiconarEmpresa(em);
					 }
				}
			}
		});
		getContentPane().add(tabbedPane, BorderLayout.CENTER);
		
		JPanel panel = new JPanel();
		tabbedPane.addTab("Dados Cadastrais", null, panel, null);
		
		JLayeredPane layeredPane = new JLayeredPane();
		layeredPane.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Dados Empresariais", TitledBorder.LEADING, TitledBorder.TOP, null, Color.DARK_GRAY));
		
		JLayeredPane layeredPane_1 = new JLayeredPane();
		layeredPane_1.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Endere\u00E7o", TitledBorder.LEADING, TitledBorder.TOP, null, Color.DARK_GRAY));
		
		JButton btnSalvar = new JButton("Salvar");
		btnSalvar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				try {
					EntityManagerFactory factory =
							Persistence.createEntityManagerFactory("jobsDB");
							EntityManager manager = factory.createEntityManager();

							manager.getTransaction().begin();

							Endereco e = new Endereco();
							e.setRua(txtRua.getText());
							e.setNumero(txtNumero.getText());
							e.setBairro(txtBairro.getText());
							e.setCidade(txtCidade.getText());
							e.setEstado(txtEstado.getText());
							e.setPais(txtPais.getText());

							Empresa em = new Empresa();
							em.setNome(txtNome.getText());
							em.setCnpj(txtCnpj.getText());
							em.setRamo(txtRamo.getText());
							em.setTelefone(txtTelefone.getText());
							em.setEmail(txtEmail.getText());
							em.setEndereco(e);

							manager.merge(em);

							manager.getTransaction().commit();

							manager.close();
							factory.close();
						
				}catch(Exception erro)
				
				{
					erro.printStackTrace();
				}
			}
			
		});
		btnSalvar.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\disk.png"));
		
		JButton button_2 = new JButton("Novo");
		button_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				 //Empresa
				txtNome.setText("");
				txtCnpj.setText("");
				txtRamo.setText("");
				txtTelefone.setText("");
				txtEmail.setText("");
				
				
				//Endereço
				txtRua.setText("");
				txtNumero.setText("");
				txtBairro.setText("");
				txtCidade.setText("");
				txtEstado.setText("");
				txtPais.setText("");
				
			}
		});
			
		button_2.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\new.png"));
		
		JButton btnRemover = new JButton("Remover");
		btnRemover.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\delete.png"));
		btnRemover.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(arg0.getClickCount() == 2){
					int linha = table.getSelectedRow();
					if(linha != -1) {
						int idSelecionado = (Integer) table.getValueAt(linha, 0);
						EntityManager manager = EntityManagerUtil.getManager();
						manager.getTransaction().begin();
						Empresa em = manager.find(Empresa.class, idSelecionado);
						if(em != null) {
							 Empresa empresa = manager.find(Empresa.class, idSelecionado);
						     Endereco e = manager.find(Endereco.class, idSelecionado);
							 
							 manager.remove(em);
							 manager.remove(e);
							
							
							System.out.println(em.getNome());
							tabbedPane.setSelectedIndex(0);
						} else {
							System.out.println("empresa não selecionada");
						}
						manager.getTransaction().commit();
						manager.close();
					} else {
						System.out.println("nenhuma linha");
					}
				} else{
					System.out.println("qtd click: "  + arg0.getClickCount() );
				}
			}
				
			
		});
		GroupLayout gl_panel = new GroupLayout(panel);
		gl_panel.setHorizontalGroup(
			gl_panel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel.createSequentialGroup()
					.addGap(18)
					.addGroup(gl_panel.createParallelGroup(Alignment.LEADING)
						.addComponent(layeredPane_1, 0, 0, Short.MAX_VALUE)
						.addComponent(layeredPane, GroupLayout.PREFERRED_SIZE, 443, GroupLayout.PREFERRED_SIZE))
					.addGap(20))
				.addGroup(gl_panel.createSequentialGroup()
					.addGap(66)
					.addComponent(btnSalvar, GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(button_2, GroupLayout.DEFAULT_SIZE, 115, Short.MAX_VALUE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(btnRemover, GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE)
					.addGap(73))
		);
		gl_panel.setVerticalGroup(
			gl_panel.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel.createSequentialGroup()
					.addContainerGap()
					.addComponent(layeredPane, GroupLayout.PREFERRED_SIZE, 144, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(layeredPane_1, GroupLayout.PREFERRED_SIZE, 151, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)
						.addComponent(button_2, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)
						.addComponent(btnSalvar, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)
						.addComponent(btnRemover))
					.addGap(12))
		);
		
		JLabel label_5 = new JLabel("Rua:");
		label_5.setBounds(10, 23, 46, 14);
		layeredPane_1.add(label_5);
		
		txtRua = new JTextField();
		txtRua.setColumns(10);
		txtRua.setBounds(10, 36, 331, 20);
		layeredPane_1.add(txtRua);
		
		JLabel label_6 = new JLabel("N\u00FAmero:");
		label_6.setBounds(354, 23, 66, 14);
		layeredPane_1.add(label_6);
		
		txtNumero = new JTextField();
		txtNumero.setColumns(10);
		txtNumero.setBounds(354, 36, 78, 20);
		layeredPane_1.add(txtNumero);
		
		JLabel label_7 = new JLabel("Cidade:");
		label_7.setBounds(228, 60, 46, 14);
		layeredPane_1.add(label_7);
		
		txtCidade = new JTextField();
		txtCidade.setColumns(10);
		txtCidade.setBounds(228, 75, 204, 20);
		layeredPane_1.add(txtCidade);
		
		JLabel label_8 = new JLabel("Bairro:");
		label_8.setBounds(10, 60, 46, 14);
		layeredPane_1.add(label_8);
		
		txtBairro = new JTextField();
		txtBairro.setColumns(10);
		txtBairro.setBounds(10, 75, 208, 20);
		layeredPane_1.add(txtBairro);
		
		JLabel label_9 = new JLabel("Estado:");
		label_9.setBounds(10, 100, 46, 14);
		layeredPane_1.add(label_9);
		
		txtEstado = new JTextField();
		txtEstado.setColumns(10);
		txtEstado.setBounds(10, 115, 208, 20);
		layeredPane_1.add(txtEstado);
		
		JLabel label_10 = new JLabel("Pa\u00EDs:");
		label_10.setBounds(228, 100, 46, 14);
		layeredPane_1.add(label_10);
		
		txtPais = new JTextField();
		txtPais.setColumns(10);
		txtPais.setBounds(228, 115, 204, 20);
		layeredPane_1.add(txtPais);
		
		JLabel label = new JLabel("Nome:");
		label.setBounds(50, 27, 46, 14);
		layeredPane.add(label);
		
		txtNome = new JTextField();
		txtNome.setColumns(10);
		txtNome.setBounds(50, 42, 384, 20);
		layeredPane.add(txtNome);
		
		JLabel label_1 = new JLabel("CNPJ:");
		label_1.setBounds(10, 64, 46, 14);
		layeredPane.add(label_1);
		
		txtCnpj = new JTextField();
		txtCnpj.setColumns(10);
		txtCnpj.setBounds(10, 78, 153, 20);
		layeredPane.add(txtCnpj);
		
		JLabel label_2 = new JLabel("Ramo de Mercado:");
		label_2.setBounds(173, 64, 134, 14);
		layeredPane.add(label_2);
		
		txtRamo = new JTextField();
		txtRamo.setBounds(173, 78, 261, 20);
		layeredPane.add(txtRamo);
		txtRamo.setColumns(10);
		
		JLabel label_3 = new JLabel("E-mail:");
		label_3.setBounds(173, 99, 46, 14);
		layeredPane.add(label_3);
		
		txtEmail = new JTextField();
		txtEmail.setColumns(10);
		txtEmail.setBounds(173, 113, 261, 20);
		layeredPane.add(txtEmail);
		
		JLabel label_4 = new JLabel("Telefone:");
		label_4.setBounds(10, 99, 60, 14);
		layeredPane.add(label_4);
		
		txtTelefone = new JTextField();
		txtTelefone.setColumns(10);
		txtTelefone.setBounds(10, 113, 153, 20);
		layeredPane.add(txtTelefone);
		
		JLabel lblId = new JLabel("ID:");
		lblId.setBounds(10, 25, 20, 18);
		layeredPane.add(lblId);
		
		txtId = new JTextField();
		txtId.setEditable(false);
		txtId.setBounds(10, 42, 30, 20);
		layeredPane.add(txtId);
		txtId.setColumns(10);
		panel.setLayout(gl_panel);
		
		JPanel panel_1 = new JPanel();
		tabbedPane.addTab("Relatórios", null, panel_1, null);
		
		JScrollPane scrollPane = new JScrollPane();
		
		GroupLayout gl_panel_1 = new GroupLayout(panel_1);
		gl_panel_1.setHorizontalGroup(
			gl_panel_1.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_1.createSequentialGroup()
					.addContainerGap()
					.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 451, Short.MAX_VALUE)
					.addContainerGap())
		);
		gl_panel_1.setVerticalGroup(
			gl_panel_1.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panel_1.createSequentialGroup()
					.addContainerGap()
					.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 266, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(78, Short.MAX_VALUE))
		);
		
		table = new JTable();
		table.setModel(new EmpresasTableModel());
		table.getColumnModel().getColumn(0).setPreferredWidth(36);
		table.getColumnModel().getColumn(1).setPreferredWidth(137);
		table.getColumnModel().getColumn(2).setPreferredWidth(92);
		table.getColumnModel().getColumn(3).setPreferredWidth(110);
		table.getColumnModel().getColumn(4).setPreferredWidth(111);
		scrollPane.setViewportView(table);
		
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(arg0.getClickCount() == 2){
					int linha = table.getSelectedRow();
					if(linha != -1) {
						int idSelecionado = (Integer) table.getValueAt(linha, 0);
						EntityManager manager = EntityManagerUtil.getManager();
						manager.getTransaction().begin();
						Empresa em = manager.find(Empresa.class, idSelecionado);
						if(em != null) {
							//Empresa
							
						    txtId.setText(""+em.getId());
							txtNome.setText(em.getNome());
							txtCnpj.setText(em.getCnpj());
							txtRamo.setText(em.getRamo());
							txtTelefone.setText(em.getTelefone());
							txtEmail.setText(em.getEmail());
							
							//Endereço
							
							txtRua.setText(em.getEndereco().getRua());
							txtNumero.setText(em.getEndereco().getNumero());
							txtBairro.setText(em.getEndereco().getBairro());
							txtCidade.setText(em.getEndereco().getCidade());
							txtEstado.setText(em.getEndereco().getEstado());
							txtPais.setText(em.getEndereco().getPais());
							
							
							
							System.out.println(em.getNome());
							tabbedPane.setSelectedIndex(0);
						} else {
							System.out.println("empresa não selecionada");
						}
						manager.getTransaction().commit();
						manager.close();
					} else {
						System.out.println("nenhuma linha");
					}
				} else{
					System.out.println("qtd click: "  + arg0.getClickCount() );
				}
			}
		});
		
		panel_1.setLayout(gl_panel_1);

	}
}


package br.com.andreiv.jobs.gui;

import java.awt.BorderLayout;

public class TelaPrincipal extends JFrame {

	private JPanel contentPane;
	private JDesktopPane desktop;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TelaPrincipal frame = new TelaPrincipal();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TelaPrincipal() {
		setResizable(false);
		setIconImage(Toolkit.getDefaultToolkit().getImage("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\user_suit.png"));
		setTitle("Sistema para RH Jobs Employment");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 800, 600);
		
		JMenuBar MenuPrincipal = new JMenuBar();
		setJMenuBar(MenuPrincipal);
		
		JMenu mnCadastrar = new JMenu("Cadastrar");
		mnCadastrar.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\add.png"));
		MenuPrincipal.add(mnCadastrar);
		
		JMenuItem mntmVagas = new JMenuItem("Vagas");
		mntmVagas.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				new TelaVagas().show();
			}
		});
		
		JMenuItem mntmEmpresa = new JMenuItem("Empresas");
		mntmEmpresa.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\building.png"));
		mntmEmpresa.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				TelaEmpresas tela = new TelaEmpresas();
				desktop.add(tela);
				tela.setVisible(true);

			}
			}
			);
		mnCadastrar.add(mntmEmpresa);
		
		JSeparator separator_4 = new JSeparator();
		mnCadastrar.add(separator_4);
		mntmVagas.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\book.png"));
		mnCadastrar.add(mntmVagas);
		
		JSeparator separator_1 = new JSeparator();
		mnCadastrar.add(separator_1);
		
		JMenuItem mntmCandidatos = new JMenuItem("Candidatos");
		mntmCandidatos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				TelaCandidatos tela = new TelaCandidatos();
				desktop.add(tela);
				tela.setVisible(true);
			}
		});
		mntmCandidatos.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\user.png"));
		mnCadastrar.add(mntmCandidatos);
		
		JSeparator separator_2 = new JSeparator();
		mnCadastrar.add(separator_2);
		
		JMenuItem mntmCurrculos = new JMenuItem("Curr\u00EDculos");
		mntmCurrculos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				new TelaCurriculos().show();
			}
		});
		mntmCurrculos.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\page.png"));
		mnCadastrar.add(mntmCurrculos);
		
		JSeparator separator_3 = new JSeparator();
		mnCadastrar.add(separator_3);
		
		JMenuItem mntmCursos = new JMenuItem("Cursos");
		mntmCursos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				new TelaCursos().show();
			}
		});
		mntmCursos.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\folder.png"));
		mnCadastrar.add(mntmCursos);
		
		JMenu mnSair = new JMenu("Sair");
		mnSair.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\door_out.png"));
		mnSair.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				System.exit(0);
			}
		});
		MenuPrincipal.add(mnSair);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout());
		desktop = new JDesktopPane();
		contentPane.add(desktop, BorderLayout.CENTER);
		
		JLabel label = new JLabel("");
		label.setIcon(new ImageIcon("D:\\Documentos\\JAVA\\Projetos Eclipse\\JobsEmp\\Imagens\\Sem T\u00EDtulo-1.jpg"));
		label.setBounds(-11, 0, 791, 541);
		desktop.add(label);
	}
}


package br.com.andreiv.jobs.gui;

import javax.swing.table.DefaultTableModel;

import br.com.andreiv.jobs.bean.Empresa;

public class EmpresasTableModel extends DefaultTableModel{
	
	public EmpresasTableModel() {
		super(new Object[][] {}, new String[] {"Id", "Nome", "CNPJ", "Rua", "Telefone"});
	}
	
	public void adiconarEmpresa(Empresa em){
		Object[] linha = new Object[5];
		linha[0] = em.getId();
		linha[1] = em.getNome();
		linha[2] = em.getCnpj();
		linha[3] = em.getEndereco().getRua();
		linha[4] = em.getTelefone();
		
		addRow(linha);
	}
	
	public void limpar() {
		setNumRows(0);
	}

	@Override
	public boolean isCellEditable(int arg0, int arg1) {
		return false;
	}
	
	

}
GOSTEI 0
Andreiv Araújo

Andreiv Araújo

28/05/2013

Aí cara, o JInternal Frame, o JFrame Princiapal e a classe table Model! Se poder me ajudar, agradeço! Caso aja necessidade de mais algum código, pode falar! Estou usando o Entity (Sem DAO).
GOSTEI 0
Rafael Benetti

Rafael Benetti

28/05/2013

voce ja tentou colocar
um commit depois de eliminar igual voce fez para salvar???


ou tentar fazer assim...

        ep = enderco que voce quer eliminar...

         Endereco e =  manager.merge(ep);
         manager.remove(e);



Caso nao der certo de novo tenta fazer assim...



String query = "DELETE FROM Empresa empresa " + " WHERE empresa.id  = ?1 " ;

        Query qr = createQuery(query, idEmpresa);
        return qr.executeUpdate();


          ed = endereco que voce quer eliminar...

         Endereco e =  manager.merge(ed);
         manager.remove(e);




Desculpa se estou sendo muito basico...meu conhecimento nao e tao grande assim...
mas acredito que primeiro voce elimina o endereco de depois a Empresa...

para nao ter problemas con chaves primarias...

d tem que dar certinho cara!!!

espero poder estar de ajudando!!!

GOSTEI 0
Andreiv Araújo

Andreiv Araújo

28/05/2013

Tentarei aqui cara! Muito obrigado!
GOSTEI 0
Rafael Benetti

Rafael Benetti

28/05/2013

Me avisa se der certo...!!!
depois se voce quiser eu tenho varias video aulas sobre Hibernate uma do prof Neri.. se quiser posso te passar.. e aqui na devmedia tem um muito bom tbm com o prof Luiz parace que o nome dele!!!
os dois sao muito bom o Neri te ensida mais bascio soh que de uma forma simples de aprender... voce ja pode por em pratica o da devmedia ja eh mais profissional ai seria bom ter um conhecimento basico(fica 10)..
espero pder ajudar ficarei muito grato!!!
abracos!!!
GOSTEI 0
POSTAR