Buenas Comunidad, quisiera saber si alguien conoce algun ejemplo de un proyecto diseñado en 3 capas con el lenguaje java, ya que estoy por iniciarme en esto y no se como esta el asunto, ya se lo que es 3 capas pero no me vendria mal un ejemplo basico. Gracias por su ayuda!!
Yo trabajo con tres capas y pienso que no puedes haber preguntado nada mejor las tres capas son excelentes te ayudan a crear aplicación muy profesional siguiendo todas las cosas buenas que debe tener un buen software reutilización escalabilidad desacoplamiento y lo mas importante a lo que veo muy pocos que hacen es no mesclar la lógica de usuario con la lógica de la aplicación
Con eso te olvidas del maldito código autogenerado con sus horribles 100 líneas que solo sirven para poner el layaut incrustado con la lógica de la aplicación si quieres cambiar de vista sin usar 3 capas tendrías que cambiarlo todo en cambio si usas 3 capas solo cambias la vista
Las 3 capas no es un patrón de diseño debido a que no resuelve un problema estándar si no que te dice de forma estricta como modelar toda la aplicación
Si trabajas con 3 capas + inyección de dependencias + interfaces y clases abstractas te va a quedar un sistema digno de un ingeniero
Las 3 capas sirven para proyectos muy grandes que quieran perdurar por los siglos de los siglos si no es así mejor trabaja solo en 2 capas
Lamentablemente no es perfecta y e notado cosas muy feas acerca de las 3 capas
Aumenta la cantidad de código enormemente lo que no significa que el código este desordenado al contrario se pone muy desacoplado
Vuelve demasiado lento al principio como siempre hacer algo estricto y muy elaborado (una arquitectura) siempre es lento al principio pero al muy largo plazo devuelve el costo con intereses
No tiene muy buena integración con ides espeto netbenas (cada capa seria un modulo)
No tiene una capa que yo la llamaría de especificación o común en la cual iría todos las clases e interfaces que son comunes en todas las capas
pero yo solamente busco un ejemplo para guiarme como debe ser leerme el codigo para entendermelo por mi mismo e buscado en san google y no hay buenos ejemplos si alguien tuviera un ejemplo en java usando 3 capas..gracias y saludos
Si sigo con el ejemplo lo voy a terminar en casi hora y media para la tarde ya va estar posteado
-yo trabajo con una variación de 3 capas en realidad trabajo con 4 capas con una cuarta que seria la capa común en donde están dos paquetes el paquetes de entidades o (objetos de negocio) y el paquete de interfaces(esas interfaces que son comunes en tre las capas)
Este post es el que mas te va a gustar voy a explicar como se implementa en java 3 capas en un sentido más técnico y en el idioma de un programador casi nadie lo ase así suelen ser demasiado teóricos y no dan un ejemplo concreto
El ejemplo es el mas sencillo que se me pueda ocurrir va a ser un sistema para un restaurante que funciona bajo una misma pc sin nada espectacular (inyección de dependencias, clases abstractas) si el ejemplo no va con lo que necesitas puedes avisarme para acomodarlo a tu caso
- las capas por recomendación serian paquetes en netbenas además serian modulos
-para la capa común iría en com.PollitosPeru.sistemaVenta.comun
-en la capa de datos irían clases que se conecten con la fuente de base de datos siendo el caso mas común conectarse con una base de datos relacional con jdbc o alguna especificación de jpa yo hago el ejemplo con jdbc siendo el nombre del paquete com.PollitosPeru.sistemaVenta.datos además una clase que represente mi conexión en particular ConexionPollito importara a com.PollitosPeru.sistemaVenta.comun
-en la capa de lógica de negocio estar en el paquete com.PollitosPeru.sistemaVenta.logica aca pondré mi lógica de negocio y solo lógica por ningún motivo importara del paquete javax.swing o alguna librería grafica
con excepción de que llame a las clases que representen modelos como javax.swing.table.AbstractableModel o javax.swing.TableModel solo hará importaciones a la capa de datos y a la capa común no habrá sin ninguna excepción importaciones al paquete java.sql o javax.sql o alguno que se equivalente
-en la capa de vista hira dentro del paquete com.PollitosPeru.sistemaVenta.vista aqui abra las todos los formularios las clases que sean hijos nietos o vistnientos de Componet si es formulario comenzar con Frm como FrmLoguin FrmCaja y si es panel comenzara con Pan como PanCabeseraCaja PanDetalleCaja aca también pondrás las clases que hagan gráficos estadísticos o impriman reportes
package com.pollitosperu.sistemaVentas.comun.Entidades;
/**
*
* @author luis
*/
public class Producto {
private int codigo;
private String nombre;
private int cantidad;
private String descripcion;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
}
package com.pollitosperu.sistemaVentas.comun.Interfases;
import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
import java.util.ArrayList;
public interface IdaoProducto {
public void agreagProducto(Producto producto);
public void eliminaProducto(int codigo);
public void modificaProducto(int codigo, Producto producto);
public ArrayList<Producto> listaProductos();
}
package com.pollitosperu.sistemaVentas.datos;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author luis
*/
public class ConexionPollito {
private Connection conection = null;
public Connection getConection() {
if (conection == null) {
try {
Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(driver);
conection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pollitosperu", "root", "root");
} catch (SQLException ex) {
ex.printStackTrace();
Logger.getLogger(ConexionPollito.class.getName()).log(Level.SEVERE, null, ex);
}
}
return conection;
}
}
package com.pollitosperu.sistemaVentas.datos;
import com.pollitosperu.sistemaVentas.comun.Entidades.Interfases.IdaoProducto;
import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
*
* @author luis
*/
public class DBdaoProducto implements IdaoProducto {
private Connection connection = new ConexionPollito().getConection();
public void agreagProducto(Producto producto) {
try {
CallableStatement statement = connection.prepareCall("{call agreagaProducto (?,?,?)}");
statement.setString("nombre", producto.getNombre());
statement.setInt("cantidad", producto.getCantidad());
statement.setString("descripcion", producto.getNombre());
statement.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public void eliminaProducto(int codigo) {
try {
CallableStatement statement = connection.prepareCall("{call eliminaProducto (?)}");
statement.setInt("cod", codigo);
statement.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public void modificaProducto(int codigo, Producto producto) {
try {
CallableStatement statement = connection.prepareCall("{call modificaProducto (?,?,?,?)}");
statement.setInt("cod", codigo);
statement.setString("nom", producto.getNombre());
statement.setInt("cant", producto.getCantidad());
statement.setString("descrip", producto.getNombre());
statement.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public ArrayList<Producto> listaProductos() {
ArrayList<Producto> productos = new ArrayList<Producto>();
try {
CallableStatement statement = connection.prepareCall("{call listaProductos }");
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
Producto producto = new Producto();
producto.setNombre(resultSet.getString("nombre"));
producto.setCodigo(resultSet.getInt("codigo"));
producto.setCantidad(resultSet.getInt("cantidad"));
producto.setDescripcion(resultSet.getString("descripcion"));
productos.add(producto);
}
return productos;
} catch (SQLException ex) {
ex.printStackTrace();
return null;
}
}
}
package com.pollitosperu.sistemaVentas.logica;
import com.pollitosperu.sistemaVentas.comun.Entidades.Interfases.IdaoProducto;
import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
import com.pollitosperu.sistemaVentas.datos.DBdaoProducto;
import java.util.ArrayList;
/**
*
* @author luis
*/
public class DaoProducto implements IdaoProducto {
private DBdaoProducto daoProducto = new DBdaoProducto();
public DaoProducto() {
}
public void agreagProducto(Producto producto) {
daoProducto.agreagProducto(producto);
}
public void eliminaProducto(int codigo) {
daoProducto.eliminaProducto(codigo);
}
public void modificaProducto(int codigo, Producto producto) {
daoProducto.modificaProducto(codigo, producto);
}
public ArrayList<Producto> listaProductos() {
return daoProducto.listaProductos();
}
}
package com.pollitosperu.sistemaVentas.vista;
import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
import com.pollitosperu.sistemaVentas.logica.DaoProducto;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.DefaultListModel;
/**
*
* @author luis
*/
public class FrmProducto extends javax.swing.JFrame {
......
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
DaoProducto daoProducto = new DaoProducto();
Producto producto = new Producto();
producto.setNombre(txtnombre.getText());
producto.setDescripcion(txtDescripcion.getText());
producto.setCantidad(Integer.parseInt(txtCantidad.getText()));
daoProducto.agreagProducto(producto);
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
DaoProducto daoProducto = new DaoProducto();
daoProducto.eliminaProducto(1);
}
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
DaoProducto daoProducto = new DaoProducto();
ArrayList<Producto> productos = daoProducto.listaProductos();
Iterator iterator = productos.iterator();
DefaultListModel defaultListModel = new DefaultListModel();
jList1.setModel(defaultListModel);
defaultListModel.clear();
while (iterator.hasNext()) {
Producto producto = new Producto();
producto = (Producto) iterator.next();
defaultListModel.addElement(producto.getNombre());
}
}
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
DaoProducto daoProducto = new DaoProducto();
Producto producto = new Producto();
producto.setNombre(txtnombre.getText());
producto.setDescripcion(txtDescripcion.getText());
producto.setCantidad(Integer.parseInt(txtCantidad.getText()));
daoProducto.modificaProducto(Integer.parseInt(txtcodigo.getText()), producto);
}
}fin de clase
preguntas traumas maleteos y amenasas hacer el post correspondiente :xD
me gustaria ver tus interfaces de usuario para guiarme ps xq el resto esta comprensible ok man gracias saludos..
:-X
bueno para darte el gusto
(http://www.subirimagen.info/thumb-011A_4BD652F7.jpg) (http://www.subirimagen.info/share-011A_4BD652F7.html)
Excelente post sapito169, gracias por aportarnos cómo trabajar con 3 capas, está muy bien explicado y entendible, me gusta como trabajas el diseño de las 3 capas, es cierto que el código queda más grande e incluso algunos lo pueden ver repetitivo, pero, al tener que modificar algo de la aplicación se ven los beneficios. ;-)
-acerca de que si es repetitivo si lo es y es espectacularmente lento :rolleyes:
pero eso se puede resolver usando reflexión (reinventando la rueda) o mejor aun usando jpa
-en vista que el post fue un Éxito voy hacer el siguiente post acerca de como hacer 3 capas usando la especificación de jpa así se olvidan de hacer su dao(la clase que agrega modifica y elimina) por entidad
Usar 3 capas con jpa es espectacularmente practico y mas rápido que con la manera que les e enseñado validad para jdbc tal ves haga un video de como hacer las capas en netbenas pero eso todavía dentro de una semana
Hola Sapito169. quisiera saber si ya has colgado como programar en 3 capas con la implementacion jpa que mencionas, este ejemplo realmente es genial, y se agradece a gente como tu por estos sitios.
Un saludo.
Gracias sapito por tu aporte!
si contestaras los mails o mps serias perfecto :D
sapito se ha ganado una estatua de oro en el distrito java de la ciudad de elhacker.net ;-) ;-) ;-) ;-)!!
Saludos
Gracias Sapito, muy buen trabajo, ha costado un poco entender porque soy newbie (demasiado) pero corregimos algunas pequeñeces y ha salido funcionando.
Abrazos
en primer lugar gracias por leer y disculparme por la mala ortografía voy a corregirlo ya me había olvidado de el post actualmente estoy estudiando y trabajando (en un lenguaje que nunca me enseñaron ) además estoy dando un curso de certificación $%&$%& esa •%•%%$&$ cuesta como •$%•%•$% >:D y por ningún motivo puedo desaprobar la o sacar me mala nota por lo tanto te imaginaras que no tengo tiempo así que te digo que no hice el ejemplo en jpa y que tendrías que esperar hasta el sábado además te cuento que aprendido y mejorado desde que cree el post te cuento que hay algunas cosas que están mal en primer lugar el manejo de errores es malo oculte el error de tal manera que nadie se entera y nadie puede hacer nada en caso de error la otra cosa que e cambiado es que ahora programo mas desacoplado y toda la creación de la aplicación lo creo en una sola aparte así es muy fácil cambiar radicalmente el comportamiento de la aplicación
Hola sapito:
Primero que todo muchas gracias y felicitaciones por las explicaciones, han sido muy sencillas y faciles de entender.
Adicionalmente has sido muy concreto y directo, cualidad de maestros.
Espero que hayas culminado con el exito el curso y te deseo lo mejor en este nuevo 2011.
Si no es mucho pedir, te solicito el favor que ojalá pudieras postear un ejemplo del manejo de errores y otro ejemplo (sencillo, claro está) con el tema que refieres en nov. 25 que dice "toda la creación de la aplicacion lo creo en una sola aparte asi es muy facil cambiar radicalmente el comportamiento de la apliacion".
De nuevo muchas gracias, has hecho un aporte muy valioso sobre todo a algunos novatos en Java como yo.
Saludos,
Maguevara
Bueno la respuesta que te voy a dar es algo rara
Algunos me van a criticar por querer programar todo lo más orientado a objetos porque creo que los patrones orientados a objetos pueden ser una gran fuente de solución de problemas que pueden reducir el código basura y te dan la posibilidad de crear código reutlsable incluso sin recompilar es por eso de descubrir que el trabajo en como yo lo e implementado no es muy orientado a objetos y es mas lo conocen como modelo anémico de objetos :laugh: que ironía
Algunos me van a decir que tengo una opinión casi religiosa de la santa oo
Es por eso que voy a hacer el post un poco diferente
Otra cosa es que no puede hacer un código con el manejo de error que yo quisiera sin poner mucho código basura debido al uso de interfaces no se si alguien sabe algún patrón para solucionar eso
Cambiar a la forma en que trabajaba antes no va a ser tan difícil tampoco
Primero como cualquier talibán de la oo comienzan creando un paquete paquete que diga algo como entidad dominio lógica en mí caso estoy creando una aplicación de venta de platos para el restaurant de la tía veneno creo e paquete com.tiaveneno.ventas.compartido.modelo
Dentro creo la clase
Orden
Siguiendo algunas recomendaciones de mi compañero y aprendiz joshua bloch
Utilizo lo mas que pueda la palabra reservada final así me evito problemas de que algún despistado por error vuelva a re instanciar la clase y haga que explote todo
También evito crear relaciones de tipo gallina huevo por evitar problemas de loops infinitos como por ejemplo seria difícil crear el método tostring si la clase detalle de orden tenga una relación a orden además evito lo más posible utilizar el punto más de 2 veces por qué hace el código difícil de testear y crear clases mal diseñadas que hacen cosas que no le incumben evito poner cosas como
orden().getDetalle().getPlato().getPrecio
package com.tiaveneno.ventas.compartido.modelo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class Orden {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private short numero;
@ManyToOne(cascade = CascadeType.ALL)
private Personal cajero;
@ManyToOne(cascade = CascadeType.ALL)
private Personal mozo;
@Temporal(TemporalType.DATE)
private Date fecha;
@OneToMany(cascade = CascadeType.ALL)
private final List<DetalleOrden> detalles = new ArrayList<DetalleOrden>();
public Orden(int id, short numero, Personal cajero, Personal mozo,
Date fecha) {
this.id = id;
this.numero = numero;
this.cajero = cajero;
this.mozo = mozo;
this.fecha = fecha;
}
public Orden() {
}
public static Orden nueva() {
return new Orden();
}
public Orden detalles(DetalleOrden... detalleOrdens) {
for (DetalleOrden detalleOrden : detalleOrdens) {
this.con(detalleOrden);
}
return this;
}
public Orden con(DetalleOrden detalleOrden) {
detalles.add(detalleOrden);
return this;
}
public double obtenerTotal() {
double total = 0;
for (DetalleOrden detalleOrden : detalles) {
total = total + detalleOrden.subtotal();
}
return total;
}
//orrible codigo boilepart inebitable getter y setters
public List<DetalleOrden> getDetalles() {
return detalles;
}
@Override
public String toString() {
return "Orden [id=" + id + ", numero=" + numero + ", cajero=" + cajero
+ ", mozo=" + mozo + ", fecha=" + fecha + ", detalles="
+ detalles + "]";
}
}
Todas las clases persistentes deben estar anotadas con
@Entity
Todas las entidades debe tener un llave primaria en mi caso creo que la mejor opción es que sea de tipo identity no me gusta que el usuario tenga que siquiera ver las claves
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
Tengo que mapear las relaciones entre clases creo que es más natural pensar que cuando guardamos una orden se deberían guardar automáticamente todos sus detalles por eso pongo cascadetype.all
@ManyToOne(cascade = CascadeType.ALL)
private Personal cajero;
Un constructor sin parámetro es obligatorio
Además creo un método que le concierne a la orden y otros que solo sirven como azúcar sintáctico (solo te evitan escribir un poco)
detalles(DetalleOrden... detalleOrdens)
Orden con(DetalleOrden detalleOrden)
double obtenerTotal()
Luego creó una abstracción la base de datos para así poder cambiarme de proveedor de persistencia sin crear tanto problema por ejemplo es fácil cambiar de jpa ibatis o lo que sea
tener en cuenta que uso generics la k es la clase de la llave primaria y e es la clase de la entidad en concreto
package com.tiaveneno.ventas.compartido.servicio;
import java.util.List;
import java.util.Map;
public interface dao<K, E> {
public abstract void remove(E... entities);
public abstract void remove(final List<E> entities);
public abstract void remove(final E entity);
public abstract void persist(final E... entities);
public abstract void persist(final List<E> entities);
public abstract void persist(final E entity);
public abstract E findById(final K id);
public abstract void close();
public abstract void update(final K key, final E entity);
public abstract void update(final Map<K, E> update);
public abstract void update(final Map.Entry<K, E>... entries);
}
y una interfas comcreta para un dao cualquiera
package com.tiaveneno.ventas.compartido.servicio;
import com.tiaveneno.ventas.compartido.modelo.Orden;
public interface OrderDao extends dao<Integer, Orden> {
// aqui pon codigo que sea propio de las orden como busca orden con un plato x
}
Finalmente pongo una implementación concreta de el proveedor de persistencia como en este caso jpa pero puedes poner el que mas te guste
package com.tiaveneno.ventas.datos.jpa;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.persistence.EntityManager;
import org.apache.commons.beanutils.BeanUtils;
import com.tiaveneno.ventas.compartido.servicio.dao;
public abstract class JpaDao<K, E> implements dao<K, E> {
private final Class<E> entityClass;
private final EntityManager entityManager;
@SuppressWarnings("unchecked")
public JpaDao(EntityManager entityManager) {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass
.getActualTypeArguments()[1];
this.entityManager = entityManager;
}
@Override
public void persist(final E entity) {
try {
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.getTransaction().commit();
} catch (Exception e) {
entityManager.getTransaction().rollback();
throw new RuntimeException(e);
}
}
@Override
public void persist(final List<E> entities) {
try {
entityManager.getTransaction().begin();
for (E e : entities) {
entityManager.persist(e);
}
entityManager.getTransaction().commit();
} catch (Exception e) {
entityManager.getTransaction().rollback();
throw new RuntimeException(e);
}
}
@Override
public void persist(E... entities) {
List<E> es = new ArrayList<E>();
for (E e : entities) {
es.add(e);
}
persist(es);
}
@Override
public void remove(final E entity) {
try {
entityManager.getTransaction().begin();
entityManager.remove(entity);
entityManager.getTransaction().commit();
} catch (Exception e) {
entityManager.getTransaction().rollback();
}
}
@Override
public void remove(final List<E> entities) {
for (E e : entities) {
remove(e);
}
}
@Override
public void remove(E... entities) {
List<E> es = new ArrayList<E>();
for (E e : entities) {
es.add(e);
}
remove(es);
}
@Override
public E findById(final K id) {
return entityManager.find(entityClass, id);
}
@Override
public void update(final K key, final E entity) {
Map<K, E> map = new HashMap<K, E>();
map.put(key, entity);
update(map);
}
@Override
public void update(final Map<K, E> update) {
Iterator<Map.Entry<K, E>> iter = update.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<K, E> entry = iter.next();
K key = entry.getKey();
E entity = entry.getValue();
@SuppressWarnings("unchecked")
E origen = (E) entityManager.find(entity.getClass(), key);
try {
BeanUtils.copyProperties(origen, entity);
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
}
@Override
public void update(final Map.Entry<K, E>... entries) {
Map<K, E> map = new HashMap<K, E>();
for (Entry<K, E> entry : entries) {
map.put(entry.getKey(), entry.getValue());
}
update(map);
};
@Override
public void close() {
if (entityManager != null) {
if (!entityManager.isOpen()) {
try {
entityManager.close();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}
}
}
Un poquito de voilepart pero esta vez te vas a quedar asi :o porque no es ni la desina parte de lo que sería con implementado con jbc
package com.tiaveneno.ventas.datos.jpa;
import javax.persistence.EntityManager;
import com.tiaveneno.ventas.compartido.modelo.Orden;
import com.tiaveneno.ventas.compartido.servicio.OrderDao;
public class JpaOrderDao extends JpaDao<Integer, Orden> implements OrderDao {
public JpaOrderDao(EntityManager entityManager) {
super(entityManager);
}
}
Si es solo eso no falta nada ahora puedes cerrar la boca
finalmente código que veríamos en el cliente
package com.tiaveneno.ventas;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import com.tiaveneno.ventas.compartido.modelo.DetalleOrden;
import com.tiaveneno.ventas.compartido.modelo.Orden;
import com.tiaveneno.ventas.compartido.modelo.Personal;
import com.tiaveneno.ventas.compartido.modelo.Plato;
import com.tiaveneno.ventas.compartido.servicio.OrderDao;
import com.tiaveneno.ventas.datos.jpa.JpaOrderDao;
public class Main {
public static void main(String[] args) {
EntityManager entityManager = Persistence. (
"jpa").createEntityManager();
OrderDao orderDao = new JpaOrderDao(entityManager);
DetalleOrden duno = new DetalleOrden((short) 1, new Plato(
"combinado fiedeos con chanfainita", 3.5));
DetalleOrden ddos = new DetalleOrden((short) 1, new Plato(
"combinado fiedeos con chanfainita", 3.5));
Orden orden = new Orden();
orden.setCajero(new Personal("cajero"));
orden.setMozo(new Personal("mozo"));
orden.detalles(duno, ddos);
orderDao.persist(orden);
}
}
Si está bien todo se guarda automáticamente en una sola transacción en caso de error hace rollback y muestra la pila por la salida estándar donde te dice la razón del error en que línea y de que clase es el error
Y me olvidaba tienes que poner un fichero de configuración en la carpeta META-INF al (costado de las clases) con el nombre de persistence.xml y agregar una librería de jipa en mi caso puse eclipse link nota no me pregunten cómo se hace eso en netbenas por que estoy enseñando a programar en java no en netbeans asi que si quieres saberlo pon el google por que poner siguiente siguiente en un wizar no es para hombres que tengan pelo en el pecho
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.tiaveneno.ventas.compartido.modelo.Cuenta</class>
<class>com.tiaveneno.ventas.compartido.modelo.DetalleOrden</class>
<class>com.tiaveneno.ventas.compartido.modelo.Orden</class>
<class>com.tiaveneno.ventas.compartido.modelo.Personal</class>
<class>com.tiaveneno.ventas.compartido.modelo.Plato</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="root" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="none" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
</persistence>
El fichero xml es un caso particular para eclipselink la primera ves que corras el programa debes reemplazar
<property name="eclipselink.ddl-generation" value="none" />
por
<property name="eclipselink.ddl-generation" value="DROP_AND_CREATE" />
ademas en
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
Tener en cuenta que lo que dice úntenme debe estar en tu código para ser creado dentro del createEntityManagerFactory
En mi caso como dice jpa yo pongo
EntityManager entityManager = Persistence. (
"jpa").createEntityManager();
Notese que estoy creando toda la aplicación desde el main asi que si quiero cambiar de proveedor de persistencia solo cambio en el main y no en 20 clases distintas
si no te equicas nunca mas vas a tener que corregir la vase de datos la sincronisacion te la hace jpa
(http://img32.imageshack.us/img32/3621/carpetasprojectojpa.png) (http://img32.imageshack.us/i/carpetasprojectojpa.png/)
Uploaded with ImageShack.us (http://imageshack.us)
http://www.mediafire.com/download.php?6ff5dxyb6pb2f6j
Hola Sapito. muy bueno tu tema, principalmente en la primera parte.
Pero tengo una duda acerca de la programacion en 3 capas.
En general poniento depormedio tu codigo.
Las Arquitectura de 3 capas se divide en :
1.- Interface, la Parte visual de nuestra aplicacion
2.- Clases de mi logica. que analizan los parametros enviador por la interface.
3.- Las Clases Ajenas a nuestra logica. (Apis, clases Generales para reutilizar,Clases ya compiladas)
Es cierto esto? o la 3 capa solo es ocupada para acceso a una BD
Y digo analizando este modelo poniendo depormedio tu codigo, por lo siguiente
Tu primera practica la estructuraste masomenos asi.
1.- Interface
2.- Tu logica que relaciona a la 1° y 3° capa
3.- Clases para la conexión de BD.
Y en la 3° capa tambien pusiste la clase "DBdaoProducto" que es donde especificas lo que se tiene que modificar en la BD.
Pero si supongamos que yo en la parte 3 coloco una Clase (Ya compilada que alguien me paso alguna ves) llamada PatronDeConeccion, que permite la conexión y modificacion de la BD por el envio de Query´s a los metodos muy generales especificados dentro.
Cuando yo quiera enviarle los parametros Query a algun metodo dentro de la Clase PatronDeConeccionesta, esta ultima clase donde iria? en el nivel de mi logica por que yo defino mis consultas o junto a la Clase PatronDeConeccion por el solo hecho de que tiene contacto directo con la BD
Disculpen, una pregunta mas.
La arquitectura de 3 capas solo es para aplicaciones que implementan una Base de Datos.?
Y si tengo una aplicacion, que no ocupa Bd, que hago ? se puede usar esta arquitectura o no ?
Hola que tal, mi nombre es Jonathan Rojas. Curso 7mo Trimestre de Ingenieria de Sistemas en la Universidad Metropolitana en caracas. En estos momentos me encuentro de vacaciones haciendo bases de datos eficientes y mi pregunta es. Conozco la idea de la programación bajo las 3 capas. Tengo ya 3 proyectos programando así más aquellos que no me piden en la Universidad y quisiera saber bajo su tutela Qué capa inicia a qué capa? porque si nos ponemos a analizar las 3 capas:
1ra Capa: Interfaz de Usuario, visible para usuario y muestra lo que queremos que el usuario vea
2da Capa: Capa Lógica, yo la llamo motor del programa, la única capa que puede acceder directamente a la capa de datos, la 1ra Capa deberá pasar por la 2da para acceder a la 3ra.
4ra Capa: Capa de datos, Base de datos, Modelación de datos, excel o lo que quieras.
Una vez que analizamos la teoria vamos a las dudas de programación que todo el mundo se hace:
Qué capa se inicializa primero? Cuál lleva el famoso main?
Bueno en mi caso he hecho los dos metodos, que la 2da capa lleve el main o la primera lo lleve. Lo lógico y teórico es que la 2da lo lleve ya que si es el motor de tu programa. Pero es un poco dificil relacionar tus ideales con la programación, hay que ser un Az para dominar esa programación.
Poniendo el main en la primera capa es sencillo, ponemos el motor como un objeto dentro de la capa y listo. Pero no se vería bonito.
Necesito opiniones..
Saludos!
Jonathan Rojas
Hola!! q tal por aca me estoy iniciando en el mundo de los sistemas en 3 capas y me ha parecido fabuloso el aporte de todos.. pero me gustaria si me pudieran ayudar en la parte en donde muestra un arreglo para visualizar una tabla de los datos... q no he podido entender... aunque hice el ejemplo no me sale.
Cita de: raao10 en 8 Octubre 2012, 17:43 PM
Hola!! q tal por aca me estoy iniciando en el mundo de los sistemas en 3 capas y me ha parecido fabuloso el aporte de todos.. pero me gustaria si me pudieran ayudar en la parte en donde muestra un arreglo para visualizar una tabla de los datos... q no he podido entender... aunque hice el ejemplo no me sale.
codigo completo
public class Main {
public static void main(String[] args) {
RepositorioTarea repositorioTarea = new RepositorioTarea();
ServicioTarea servicioTarea = new ServicioTarea(repositorioTarea);
FrmPrincipal frmPrincipal = new FrmPrincipal(servicioTarea);
frmPrincipal.setVisible(true);
}
}
import java.awt.BorderLayout;
public class FrmPrincipal extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField txtTareaNombre;
private JTable table;
private ServicioTarea servicioTarea;
public FrmPrincipal(ServicioTarea servicioTarea) {
this.servicioTarea = servicioTarea;
init();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
FrmPrincipal frame = new FrmPrincipal();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public FrmPrincipal() {
init();
}
private void init() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.NORTH);
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
JLabel lblNewLabel = new JLabel("Tarea");
panel.add(lblNewLabel);
txtTareaNombre = new JTextField();
panel.add(txtTareaNombre);
txtTareaNombre.setColumns(10);
JButton btnAgrega = new JButton("agrega");
panel.add(btnAgrega);
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
table = new JTable();
scrollPane.setViewportView(table);
table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
"Codigo", "Descripcion", "fecha" }));
btnAgrega.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
servicioTarea.agregar(new Tarea(null, txtTareaNombre.getText(),
null));
List<Tarea> tareas = servicioTarea.tareas();
DefaultTableModel defaultTableModel = (DefaultTableModel) table
.getModel();
defaultTableModel.setRowCount(0);
for (Tarea tarea : tareas) {
defaultTableModel.addRow(new Object[] { tarea.getId(),
tarea.getNombre(), tarea.getDate() });
}
}
});
}
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
public class RepositorioTarea {
private HashMap<Integer, Tarea> hashMap = new HashMap<>();
public void agregar(Tarea tarea) {
int size = hashMap.size();
hashMap.put(size + 1,
new Tarea(size + 1, tarea.getNombre(), tarea.getDate()));
}
public List<Tarea> listar() {
ArrayList<Tarea> respuesta = new ArrayList<>();
Collection<Tarea> values = hashMap.values();
for (Tarea tarea : values) {
respuesta.add(new Tarea(tarea.getId(), tarea.getNombre(), tarea
.getDate()));
}
return respuesta;
}
}
import java.util.Date;
import java.util.List;
public class ServicioTarea {
private final RepositorioTarea repositorioTarea;
public ServicioTarea(RepositorioTarea repositorioTarea) {
this.repositorioTarea = repositorioTarea;
}
public void agregar(Tarea tarea) {
tarea.setDate(new Date());
repositorioTarea.agregar(tarea);
}
public List<Tarea> tareas() {
return repositorioTarea.listar();
}
}
import java.util.Date;
public class Tarea {
private Integer id;
private String nombre;
private Date date;
public Tarea(Integer id, String nombre, Date date) {
this.id = id;
this.nombre = nombre;
this.date = date;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
porfavor respondeme te lo suplico
Pido POR FAVOR a la comunidad que escribamos BIEN. Que seamos ingenieros no significa que cometamos errores de ortografía detestables!