Hibernate: mapeo de bolsas

Para una empresa multinacional, por lo general, las selecciones se realizan en base a preguntas técnicas/preguntas de aptitud. Si nos referimos a una pregunta, cada una tendrá un conjunto de un mínimo de 4 opciones, es decir, cada pregunta tendrá N soluciones. Entonces podemos representar eso por medio de la relación «TIENE A», es decir, 1 pregunta tiene 4 soluciones. A través de Bag Mapping, en Hibernate, podemos implementar eso. Veamos eso

 

Proyecto de ejemplo

Primero creemos tablas MYSQL

--Main table where each question is identified by qId and it is unique
create table Questions(
    qId int auto_increment,
    questionName varchar(50),
    Primary key (qId)
);
--For each question, we will have several choices. It is denoted as below
create table Choices(
  questionId int,
  answer varchar(100)
  );

Estructura del proyecto:

Project Structure

 

En el archivo de mapeo, tenemos que representar la relación de la tabla a través de un nombre de bolsa. Es como una relación de uno a muchos, pero a través del nombre de la bolsa lo representamos.

multiplechoicequestion.hbm.xml

XML

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-mapping PUBLIC  
          "-//Hibernate/Hibernate Mapping DTD 5.3//EN"  
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
<hibernate-mapping>  
         
   <!-- Questions is the table name -->
   <class name="com.gfg.hibernate.pojo.MultipleChoiceQuestion" table="Questions">  
     <id name="qId">  
       <generator class="increment"></generator>  
     </id>  
       
     <property name="questionName"></property>  
        
     <!--  This is almost like a list but here we are using bag instead of a list
              i.e. 1 question can have n choices. It is done by means of bag.
              Main advantage is it does not have a index element -->
     <bag name="choices" table="Choices">  
       <key column="questionId"></key>  
       <element column="answer" type="string"></element>  
     </bag>  
  
   </class>  
              
</hibernate-mapping>

Importante configuración de hibernación para contener el archivo hbm

hibernate.cfg.xml

XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
                        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        
        <!--  As we are connecting mysql, those driver classes, database name, 
              username and password are specified
              Please change the information as per your requirement -->
        <property name="hbm2ddl.auto">update</property>  
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/geeksforgeeks?serverTimezone=UTC</property>        
        <property name="connection.username">root</property>
        <property name="connection.password">admin</property>
          
          <!--  Used bag mapping instead of list and it is specified here -->
        <mapping resource="multiplechoicequestion.hbm.xml" /> 
        
    </session-factory>
</hibernate-configuration>

Veamos la clase pojo 

MultipleChoiceQuestion.java

Java

import java.util.List;
public class MultipleChoiceQuestion {
  
    // Attributes should match
    // with 'Questions' table
    private int qId;
    private String questionName;
  
    // As each question may have 1 - N choices,
    // let us collect via a list here
    private List<String> choices;
  
    public int getqId() { return qId; }
    public void setqId(int qId) { this.qId = qId; }
    public String getQuestionName() { return questionName; }
    public void setQuestionName(String questionName)
    {
        this.questionName = questionName;
    }
    public List<String> getChoices() { return choices; }
    public void setChoices(List<String> choices)
    {
        this.choices = choices;
    }
}

Hagamos las formas de almacenar la pregunta y las opciones ahora aquí.

QuestionRepository.java

Java

import java.util.ArrayList;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  
import com.gfg.hibernate.pojo.MultipleChoiceQuestion;
  
public class QuestionRepository {
    public static void main(String[] args)
    {
  
        StandardServiceRegistry standardServiceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
        Metadata meta = new MetadataSources(standardServiceRegistry).getMetadataBuilder().build();
  
        SessionFactory sessionFactory = meta.buildSessionFactory();
        Session session = sessionFactory.openSession();
  
        Transaction transaction = session.beginTransaction();
  
        ArrayList<String> answerList1 = new ArrayList<String>();
        answerList1.add("Object Oriented Programming language");
        answerList1.add("Structural Programming language");
        answerList1.add("Hybrid Programming language");
        answerList1.add("Monolithic Programming language");
  
        ArrayList<String> answerList2 = new ArrayList<String>();
        answerList2.add("User friendly Object oriented language");
        answerList2.add("Complicated structural language");
        answerList2.add("Functional language");
        answerList2.add("RDBMS");
  
        MultipleChoiceQuestion mcq1 = new MultipleChoiceQuestion();
        mcq1.setQuestionName("Java is");
        mcq1.setChoices(answerList1);
  
        MultipleChoiceQuestion mcq2 = new MultipleChoiceQuestion();
        mcq2.setQuestionName("Python is");
        mcq2.setChoices(answerList2);
  
        session.persist(mcq1);
        session.persist(mcq2);
  
        transaction.commit();
        session.close();
        System.out.println("success. We have seen bag mapping here. Check the db data");
    }
}

Ejecución del proyecto y resultado.

 

Como hemos seguido el mapeo de bolsas, cuando el programa se ejecuta ha insertado los respectivos registros en ambas tablas. Vamos a verlos. 

 

Sus respectivas opciones se pueden ver de la siguiente manera

 

A partir de los datos insertados, podemos llegar a la conclusión de que el mapeo de bolsas ayuda a insertar datos como un concepto de uno a muchos. En lugar de una lista, utilizando el mapeo de bolsas, la relación está sucediendo. En este tutorial, hemos visto el concepto de mapeo de bolsas.

Publicación traducida automáticamente

Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *