diff --git a/pom.xml b/pom.xml index 19ff560..e70dd2c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,20 @@ - + + + org.hibernate.orm + hibernate-core + 7.1.14.Final + + + + + com.mysql + mysql-connector-j + 9.5.0 + + org.mongodb diff --git a/src/main/java/es/palomafp/aadd/inm/AppMapaMundi.java b/src/main/java/es/palomafp/aadd/inm/AppMapaMundi.java index 13687d5..15e6511 100644 --- a/src/main/java/es/palomafp/aadd/inm/AppMapaMundi.java +++ b/src/main/java/es/palomafp/aadd/inm/AppMapaMundi.java @@ -4,6 +4,7 @@ import java.util.List; import es.palomafp.aadd.inm.dao.IContinenteDAO; import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.dao.hbm.PaisDaoHibernate; import es.palomafp.aadd.inm.dao.mgdb.ContinenteDaoMongoDB; import es.palomafp.aadd.inm.dao.mgdb.PaisDaoMongoDB; import es.palomafp.aadd.inm.vo.Continente; @@ -24,23 +25,43 @@ public class AppMapaMundi { // app.probarCRUDContinente(); - app.probarCRUDPais(); + // app.probarCRUDPais(); + + app.migrarPaisesMySQLToMongoDB(); } + private void migrarPaisesMySQLToMongoDB() { + IPaisDAO paisDAO = new PaisDaoHibernate(); + List listaPaises = paisDAO.obtenerListaPaises(); + + if(listaPaises!=null) { + paisDAO = new PaisDaoMongoDB(); + for (Pais pais : listaPaises) { + Pais paisBBDD= paisDAO.obtenerPaisPorID(pais.getIdentificador()); + + if (paisBBDD==null) { + paisDAO.crearPais(pais); + }else { + paisDAO.actualizarPais(pais); + } + } + } + } + private void probarCRUDPais() { IPaisDAO paisDAO = new PaisDaoMongoDB(); - String codigoContinente= "01"; + String codigoContinente= "02"; Continente continente = new Continente(); continente.setCodigo(codigoContinente); - continente.setNombreContinente("América"); + continente.setNombreContinente("Europa"); Pais pais = new Pais(); int identificador= 213; pais.setIdentificador(identificador); - pais.setNombrePais("De las maravillas"); - pais.setCapital("Centro de la maravilla"); + pais.setNombrePais("Déslibai"); + pais.setCapital("Blotretico"); pais.setContinente(continente); @@ -57,7 +78,7 @@ public class AppMapaMundi { List listaPais= paisDAO.obtenerListaPaises(); System.out.println(listaPais); - paisDAO.borrarPais(identificador); + //paisDAO.borrarPais(identificador); listaPais= paisDAO.obtenerListaPaises(); System.out.println(listaPais); diff --git a/src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java b/src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java new file mode 100644 index 0000000..de373ec --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/hbm/ContinenteDaoHibernate.java @@ -0,0 +1,58 @@ +package es.palomafp.aadd.inm.dao.hbm; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.query.SelectionQuery; + +import es.palomafp.aadd.inm.dao.IContinenteDAO; +import es.palomafp.aadd.inm.gestor.GestorSesionesHibernate; +import es.palomafp.aadd.inm.vo.Continente; + +/** + * + * ContinenteDaoJDBC: Clase que implementa el interfaz IContinenteDAO + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class ContinenteDaoHibernate implements IContinenteDAO { + + @Override + public List obtenerListaContientes() { + List listaContinentes = null; + String sentenciaHQL = """ + SELECT c + FROM Continente c + """; + // try con recursos "cerrables": Session + try (Session sesion = GestorSesionesHibernate.getSession();) { + SelectionQuery sentenciaConsulta = sesion.createSelectionQuery(sentenciaHQL, Continente.class); + listaContinentes = sentenciaConsulta.getResultList(); + + } catch (Exception e) { + e.printStackTrace(); + } + return listaContinentes; + + } + + @Override + public void crearContinente(Continente continente) { + } + + @Override + public Continente obtenerContinentePorID(String codigo) { + return null; + } + + @Override + public void actualizarContinente(Continente continente) { + } + + @Override + public void borrarContinente(String codigo) { + // TODO Auto-generated method stub + + } +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java b/src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java new file mode 100644 index 0000000..0ef0982 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/dao/hbm/PaisDaoHibernate.java @@ -0,0 +1,62 @@ +package es.palomafp.aadd.inm.dao.hbm; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.query.SelectionQuery; + +import es.palomafp.aadd.inm.dao.IPaisDAO; +import es.palomafp.aadd.inm.gestor.GestorSesionesHibernate; +import es.palomafp.aadd.inm.vo.Pais; + +/** + * + * PaisDaoJDBC: Clase que implementa el interfaz IPaisDAO + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 31 oct 2025 + */ +public class PaisDaoHibernate implements IPaisDAO { + + @Override + public List obtenerListaPaises() { + List listaPaises = null; + String sentenciaHQL = """ + SELECT p + FROM Pais p + """; + + // try con recursos "cerrables": Session + try (Session sesion = GestorSesionesHibernate.getSession();) { + + SelectionQuery sentenciaConsulta = sesion.createSelectionQuery(sentenciaHQL, Pais.class); + listaPaises = sentenciaConsulta.getResultList(); + + } catch (Exception e) { + e.printStackTrace(); + } + return listaPaises; + } + + @Override + public void actualizarPais(Pais pais) { + } + + @Override + public Pais obtenerPaisPorID(int identificador) { + return null; + } + + @Override + public void crearPais(Pais pais) { + // TODO Auto-generated method stub + + } + + @Override + public void borrarPais(int identificador) { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/es/palomafp/aadd/inm/dao/mgdb/PaisDaoMongoDB.java b/src/main/java/es/palomafp/aadd/inm/dao/mgdb/PaisDaoMongoDB.java index 2eee8bf..5d8727b 100644 --- a/src/main/java/es/palomafp/aadd/inm/dao/mgdb/PaisDaoMongoDB.java +++ b/src/main/java/es/palomafp/aadd/inm/dao/mgdb/PaisDaoMongoDB.java @@ -69,16 +69,14 @@ public class PaisDaoMongoDB implements IPaisDAO { // Insertar UN DOCUMENTO en la colección Document documentoPais = new Document(); - - documentoPais.append("_id", pais.getIdentificador()) - .append("nombre", pais.getNombrePais()) - .append("capital", pais.getCapital()); + documentoPais.append("_id", pais.getIdentificador()).append("identificador", pais.getIdentificador()) + .append("nombre", pais.getNombrePais()).append("capital", pais.getCapital()); - //Se carga la información del continente + // Se carga la información del continente Document documentoContinente = new Document(); - documentoContinente.append("codigo", pais.getContinente().getCodigo()) - .append("nombre", pais.getContinente().getNombreContinente()); + documentoContinente.append("codigo", pais.getContinente().getCodigo()).append("nombre", + pais.getContinente().getNombreContinente()); documentoPais.append("continente", documentoContinente); @@ -90,12 +88,22 @@ public class PaisDaoMongoDB implements IPaisDAO { public void actualizarPais(Pais pais) { // Obtener o crear una colección MongoDB MongoCollection coleccionMDb = GestorConexionMongoDB.getMongoDatabase().getCollection(COLECCION_PAIS); -/* + // Actualizar UN Continente en la colección - Bson filtro = Filters.eq("_id", continente.getCodigo()); - Bson nuevoContinente = Updates.set("nombre", continente.getNombreContinente()); - coleccionMDb.updateOne(filtro, nuevoContinente); -*/ + Bson filtro = Filters.eq("_id", pais.getIdentificador()); + + // Contenido del documento con el que se va a actualizar el documento país + // están todos los cmapos excepto _id e identificador. + Document docPaisActualizado = new Document(); + docPaisActualizado.append("nombre", pais.getNombrePais()) + .append("capital", pais.getCapital()); + Document docContinente = new Document(); + docContinente.append("codigo", pais.getContinente().getCodigo()) + .append("nombre", pais.getContinente().getNombreContinente()); + docPaisActualizado.append("continente", docContinente); + + coleccionMDb.updateOne(filtro, new Document("$set", docPaisActualizado)); + } @Override @@ -111,7 +119,8 @@ public class PaisDaoMongoDB implements IPaisDAO { private Pais getPaisFromDocumentoPais(Document documentoPais) { Pais pais = null; - int identificador = documentoPais.getInteger("_id"); + int idMongoDB = documentoPais.getInteger("_id"); + int identificador = documentoPais.getInteger("identificador"); String nombrePais = documentoPais.getString("nombre"); String capital = documentoPais.getString("capital"); diff --git a/src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java b/src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java new file mode 100644 index 0000000..b62ada4 --- /dev/null +++ b/src/main/java/es/palomafp/aadd/inm/gestor/GestorSesionesHibernate.java @@ -0,0 +1,46 @@ +package es.palomafp.aadd.inm.gestor; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +/** + * + * GestorSesionesHibernate: Clase que realiza .... + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 4 dic 2025 + * + * + */ + +public class GestorSesionesHibernate { + private static SessionFactory sessionFactory = null; + + private GestorSesionesHibernate() {// Constructor privado para evitar instanciación + } + + // Carga la configuración desde hibernate.cfg.xml + static { + try { + sessionFactory = new Configuration().configure().buildSessionFactory(); + } catch (Throwable ex) { + System.err.println("Error en SessionFactory: " + ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static Session getSession() { + return sessionFactory.openSession(); + } + + public static Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } + + public static void cerrarFactoria() { + if (sessionFactory != null) { + sessionFactory.close(); + } + } +} diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Continente.java b/src/main/java/es/palomafp/aadd/inm/vo/Continente.java index 4da562c..8de197d 100644 --- a/src/main/java/es/palomafp/aadd/inm/vo/Continente.java +++ b/src/main/java/es/palomafp/aadd/inm/vo/Continente.java @@ -1,20 +1,29 @@ package es.palomafp.aadd.inm.vo; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + /** * * Continente: Clase que se usa para mapear la tabla de continentes - * * @author Isidoro Nevares Martín - IES Virgen de la Paloma * @date 5 dic 2025 * * */ +@Entity +@Table(name="T_CONTINENTE") public class Continente { + @Id + @Column(name="codigo", columnDefinition = "char(2)") private String codigo; - + + @Column(name="nombre_continente", length=30, nullable=true) private String nombreContinente; - + public String getCodigo() { return codigo; } @@ -36,3 +45,4 @@ public class Continente { return "Continente [codigo=" + codigo + ", nombreContinente=" + nombreContinente + "]\n"; } } + diff --git a/src/main/java/es/palomafp/aadd/inm/vo/Pais.java b/src/main/java/es/palomafp/aadd/inm/vo/Pais.java index 4fd4249..b1eece8 100644 --- a/src/main/java/es/palomafp/aadd/inm/vo/Pais.java +++ b/src/main/java/es/palomafp/aadd/inm/vo/Pais.java @@ -1,5 +1,13 @@ package es.palomafp.aadd.inm.vo; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + /** * * Continente: Clase que se usa para mapear la tabla de Países @@ -8,13 +16,22 @@ package es.palomafp.aadd.inm.vo; * * */ + +@Entity +@Table(name="T_PAIS") public class Pais { + @Id + @Column(name="identificador") private int identificador; + @Column(name="nombre_pais", length=50) private String nombrePais; + @Column(name="capital", length=20) private String capital; - + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name="cod_continente") private Continente continente; public int getIdentificador() { diff --git a/src/main/resources/conf.properties b/src/main/resources/conf.properties index 0b40cd6..0a4ab37 100644 --- a/src/main/resources/conf.properties +++ b/src/main/resources/conf.properties @@ -1,2 +1,2 @@ -url.conexion.mongodb=mongodb://localhost:27017 +url.conexion.mongodb=mongodb://admin:mongodb_123@172.16.0.181:27017 bbdd.mongodb=MapaMundi \ No newline at end of file diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..d839a76 --- /dev/null +++ b/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,26 @@ + + + + + jdbc:mysql://172.16.0.181:3306/Mapa_Mundi + com.mysql.cj.jdbc.Driver + + org.hibernate.dialect.MySQLDialect + + root + mysql_123 + + + none + false + false + + + + + + + + \ No newline at end of file