Open In App

Hibernate – Collection Mapping

Last Updated : 10 Jun, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Collection elements are much needed to have one-to-many, many-to-many, relationships, etc., Any one type from below can be used to declare the type of collection in the Persistent class. Persistent class from one of the following types:

  • java.util.List
  • java.util.Set
  • java.util.SortedSet
  • java.util.Map
  • java.util.SortedMap
  • java.util.Collection

Let us see where can we use List, Set, and Map by seeing the differences among them

List

Set

Map

Duplicates are allowed. Duplicates are not allowed. Duplicates are not allowed.
Insertion order is maintained. Insertion order is not maintained. Insertion order is not maintained.
Index element helps to identify an element in the list. Hence need to use this whenever the index is possible and it is mandatory. For uniquely maintaining the collection of elements, we can go for the set. As a key/value pair pattern means we can go for Map.

Mapping List

POJO class

Java




import java.util.List;
  
public class<POJO class> {
    private int id;
    private String variableString;
    // other data members
    private List<String>
        collectionItems; // List can be of any type
                         // if we use another POJO class in
                         // the list to have one to many/many
                         // to many relationships We need to
                         // define Another POJO class in this
                         // case
    private List < Another POJO class
    > collectionItems1
  
    // getters and setters
}


XML

XML




<class name="<Respective POJO class>" table="<Respective table>">  
    <id name="id">  
     <generator class="increment"></generator>  
    </id>  
      
      <!--other properties -->
    <list name="<collectionItems>" table="<Respective child table>">  
    
    <!-- foreign key in child table that refers to Primary table -->
    <key column="id"></key>  
    
    <!-- For identification. List/Map are indexed collection -->
    <index column="type"></index>  
    
    <!-- collection element of type element> -->
    <element column="answer" type="string"></element></list>  
    
      <!-- If we are using one to many relationship -->
    <list name="<collectionItems>" >  
          <key column="id"></key>  
          <index column="type"></index>  
          <one-to-many class="<Respective child POJO class>" />  
    </list>  
</class>


In the main java file where we can do CRUD operations, we have to associate a List as follows

Main java file

Java




// Rest of code ....
ArrayList<String> list1 = new ArrayList<String>();
list1.add("example1");
list1.add("example2");


Not only List, but we can also use Bag, Set, and Map in the collections.

Mapping Bag

This is almost similar to List but the index element is not needed

Example of POJO class

Java




import java.util.List;
  
public class<POJO class> {
    private int id;
    private String variableString;
    // other data members
    private List<String>
        collectionItems; // List can be of any type
                         // if we use another POJO class in
                         // the list to have one to many/many
                         // to many relationships We need to
                         // define Another POJO class in this
                         // case
    private List < Another POJO class
    > collectionItems1
  
    // getters and setters
}


In Hibernate Mapping, it differs from the List

XML




<!-- Rest of the properties -->
<bag name="<collectionname>" table="<Respective POJO class>">  
     <key column="<foreignKeyId>"></key>  
     <!-- Here we do not have index, that is the difference with the list -->
     <element column="<collectionColumn>" type="string"></element>  
</bag>


The Main Java file is similar to the one that is used for the list.

Major difference between List and Bag: In List, the index element is mandatory, and order is maintained. In Bag, there is no index element and hence no order.

Mapping Set

XML

XML




<class name="<POJO>" table="<Respective table>">  
       ...        
          <set name="<collection Items>" table="<child table>">  
          <key column="id"></key>  
          <element column="<collection column>" type="string"></element>  
          </set>  
       ...  
</class>


POJO class

Java




import java.util.Set;
  
public class<POJO> {
    private int id;
    // other data members
    // Collection item has to be represented via Set
    private Set<String> collectionItems;
  
    // getters and setters
}


Main java file

Java




//.....
HashSet<String> set1 = new HashSet<String>();
set1.add("example1");
set1.add("example2");
//....


Mapping Map

XML

XML




<class ....>
  ....
  <map name="<collectionitems>" table="<table>" cascade="all">  
  <key column="id"></key>  
  <!-- In List and Map, index column is required -->
  <index column="<columnname>" type="string"></index>  
  <element column="<columnname>" type="string"></element>  
  </map>  
  ...
</class>  


POJO class

Java




import java.util.Map;
  
public class<POJO> {
    private int id;
    // other data members
    // a key value is maintained
    private Map<String, String> collectionItems;


Main java file

Java




//....
HashMap<String, String> map1
    = new HashMap<String, String>();
map1.put("key1", "value1");
map1.put("key2", "value2");
//....


SortedSet and SortedMap by the name itself we can come to know that if a set is sorted(ascending order by default)/a map is sorted(ascending order by default)

Mapping SortedSet

POJO class

Java




//...
private SortedSet collectionItems;
//....


XML

XML




<!-- .. -->
<!-- Here this POJO class should implement comparator
      or we can leave it as natural-->
<set name = "<collectionItems>" cascade="all" sort="<POJO class>">
         <key column = "id"/>
         <one-to-many class="<child POJO class>"/>
      </set>
<!-- .... -->


Main java file

Java




// we can use Treeset
//....
TreeSet set2 = new TreeSet();
set2.add(new<Child POJO class>(<value>));
//...


Similarly, SortedMap is similar to the map and by default, it follows natural sorting order or we can customize that

Mapping SortedMap

POJO class

Java




//...
private SortedMap collectionItems;
//...


XML

XML




<map name="collectionItems" cascade="all"  sort="natural" >
       <key column="id"/>
       <index column="indexColumn"  type="string"/>
       <one-to-many class="<child POJO class>"/>
</map>


Main Java file

Java




//...
TreeMap map = new TreeMap();
map.put("key1", value1);
map.put("key2", value2);
map.put("key3", value3);
//...


Conclusion

By using different patterns, according to the requirements, we can use collection mapping in hibernate.

  • For ordering, use List
  • For uniqueness, use Set
  • For key-value maintenance use Map
  • Using SortedMap/SortedSet is not an ideal solution as it will degrade performance. Instead, we can go for JPQL and add an Order By clause.


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads