Many to Many Bidirectional Mapping with Jersey

I am new to Hibernate and I am doing a small project where there will be two Entity classes

  1. Resources
  2. Projects

One Project can have multiple Resources(Individual developers) and also One Resource can work in multiple projects. So what I am expecting is when I invoke Resouse entity it gives me List of Project to which that resource is involved. Also on invoking Projects I guest get the List of resources who are working on this project. I am using jersey 2.29.1

When I try to run it directly using a test Utility class using Public static void main. everything works fine. But the moment I embed this code in Jersey to get a JSON response. It gives me an error.

The only thing I could figure out is that the error is because of the mapping i.e If I call resource class from Postman to get JSON response and put an annotation @JsonTransient on the List of resource in Project CLass It will work fine. But then the moment I call The Project entity it will not give me list of resource since it is Transient.

package com.oracle.ProjectManagement.Entities;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.json.bind.annotation.JsonbTransient;
import javax.persistence.*;

@Entity(name="ProjectMaster" )
@Table(name= "project_master")
public class ProjectMaster {
     
    @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Id
     @Column
     int Project_ID;
     
     @Column
     String Project_Name;
     
     @Column
     Date Start_Date;
     
     @Column
     Date End_Date;
     
     @Column
     int Onsite_Manager;
     
     @Column
     int Offshore_Manger;
     
     @Column
     int Client_ID;
     
     @Column
     String Description;
    
   
    @ManyToMany( cascade= CascadeType.ALL, mappedBy= "ProjectList")
    List<ResourceMaster> ResourseList = new ArrayList<ResourceMaster>();

    public int getProject_ID() {
        return Project_ID;
    }

    public void setProject_ID(int project_ID) {
        Project_ID = project_ID;
    }

    public String getProject_Name() {
        return Project_Name;
    }

    public void setProject_Name(String project_Name) {
        Project_Name = project_Name;
    }

    public Date getStart_Date() {
        return Start_Date;
    }

    public void setStart_Date(Date start_Date) {
        Start_Date = start_Date;
    }

    public Date getEnd_Date() {
        return End_Date;
    }

    public void setEnd_Date(Date end_Date) {
        End_Date = end_Date;
    }

    public int getOnsite_Manager() {
        return Onsite_Manager;
    }

    public void setOnsite_Manager(int onsite_Manager) {
        Onsite_Manager = onsite_Manager;
    }

    public int getOffshore_Manger() {
        return Offshore_Manger;
    }

    public void setOffshore_Manger(int offshore_Manger) {
        Offshore_Manger = offshore_Manger;
    }

    public int getClient_ID() {
        return Client_ID;
    }

    public void setClient_ID(int client_ID) {
        Client_ID = client_ID;
    }

    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }

    
    public List<ResourceMaster> getResourseList() {
        return ResourseList;
    }

    public void setResourseList(List<ResourceMaster> resourseList) {
        ResourseList = resourseList;
    }


    
}

and

package com.oracle.ProjectManagement.Entities;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.json.bind.annotation.JsonbTransient;
import javax.persistence.*;


@Entity(name= "ResourceMaster")
@Table(name = "Resource_master")

public class ResourceMaster {
    
    @Column
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    int Resource_Id;
    
    @Column
    String  First_Name;
    
    @Column
    String  Last_name;
    
    @Column
    String  Short_Name;
    
    @Column
    String  Work_Location;
    
    @Column
    int  Manager_ID;
    
    @Column
    Date  Date_of_Joining;

    public int getResource_Id() {
        return Resource_Id;
    }

    public void setResource_Id(int resource_Id) {
        Resource_Id = resource_Id;
    }

    public String getFirst_Name() {
        return First_Name;
    }

    public void setFirst_Name(String first_Name) {
        First_Name = first_Name;
    }

    public String getLast_name() {
        return Last_name;
    }

    public void setLast_name(String last_name) {
        Last_name = last_name;
    }

    public String getShort_Name() {
        return Short_Name;
    }

    public void setShort_Name(String short_Name) {
        Short_Name = short_Name;
    }

    public String getWork_Location() {
        return Work_Location;
    }

    public void setWork_Location(String work_Location) {
        Work_Location = work_Location;
    }

    public int getManager_ID() {
        return Manager_ID;
    }

    public void setManager_ID(int manager_ID) {
        Manager_ID = manager_ID;
    }

    public Date getDate_of_Joining() {
        return Date_of_Joining;
    }

    public void setDate_of_Joining(Date date_of_Joining) {
        Date_of_Joining = date_of_Joining;
    }
    
    
    @ManyToMany(fetch = FetchType.EAGER,cascade= CascadeType.ALL)
    @JoinTable(name= "resource_project_map", joinColumns = @JoinColumn(name = "Resource_id"),
              inverseJoinColumns =  @JoinColumn(name = "Project_ID") )
    List<ProjectMaster> ProjectList = new ArrayList<ProjectMaster>();

    public List<ProjectMaster> getProjectList() {
        return ProjectList;
    }

    public void setProjectList(List<ProjectMaster> projectList) {
        ProjectList = projectList;
    }
    

}

error

<!doctype html><html lang="en"><head><title>HTTP Status 500 – Internal Server Error</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 500 – Internal Server Error</h1><hr class="line" /><p><b>Type</b> Exception Report</p><p><b>Message</b> org.glassfish.jersey.server.ContainerException: java.lang.StackOverflowError</p><p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.</p><p><b>Exception</b></p><pre>javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.StackOverflowError
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:408)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:365)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:318)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
</pre><p><b>Root Cause</b></p><pre>org.glassfish.jersey.server.ContainerException: java.lang.StackOverflowError
    org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:254)
    org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:236)
    org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:436)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:261)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
    org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    org.glassfish.jersey.internal.Errors.process(Errors.java:244)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680)
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:392)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:365)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:318)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
</pre><p><b>Root Cause</b></p><pre>java.lang.StackOverflowError
    java.time.temporal.ValueRange.getMinimum(Unknown Source)
    java.time.temporal.ValueRange.isIntValue(Unknown Source)
    java.time.temporal.ValueRange.isValidIntValue(Unknown Source)
    java.time.temporal.ValueRange.checkValidIntValue(Unknown Source)
    java.time.temporal.ChronoField.checkValidIntValue(Unknown Source)
    java.time.LocalDate.ofEpochDay(Unknown Source)
    java.time.LocalDateTime.ofEpochSecond(Unknown Source)
    java.time.ZonedDateTime.create(Unknown Source)
    java.time.ZonedDateTime.ofInstant(Unknown Source)
    java.time.chrono.IsoChronology.zonedDateTime(Unknown Source)
    java.time.chrono.IsoChronology.zonedDateTime(Unknown Source)
    java.time.format.DateTimePrintContext.adjust(Unknown Source)
    java.time.format.DateTimePrintContext.&lt;init&gt;(Unknown Source)
    java.time.format.DateTimeFormatter.formatTo(Unknown Source)
    java.time.format.DateTimeFormatter.format(Unknown Source)
    org.eclipse.yasson.internal.serializer.AbstractDateTypeSerializer.formatDefault(AbstractDateTypeSerializer.java:51)
    org.eclipse.yasson.internal.serializer.AbstractDateTypeSerializer.formatDefault(AbstractDateTypeSerializer.java:28)
    org.eclipse.yasson.internal.serializer.AbstractDateTimeSerializer.toJson(AbstractDateTimeSerializer.java:77)
    org.eclipse.yasson.internal.serializer.AbstractDateTimeSerializer.serialize(AbstractDateTimeSerializer.java:52)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:95)
    org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:92)
    org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:61)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:63)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:95)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializeItem(AbstractContainerSerializer.java:141)
    org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:39)
    org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:27)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:63)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:95)
    org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:103)
    org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:61)
    
    ..
    .
    .
    .
    
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:63)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:95)
    org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializeItem(AbstractContainerSerializer.java:141)
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/9.0.35</h3></body></html>

Pom. xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.oracle</groupId>
    <artifactId>ProjectManagement</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>ProjectManagement</name>

    <build>
        <finalName>ProjectManagement</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jersey</groupId>
                <artifactId>jersey-bom</artifactId>
                <version>${jersey.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
            <!-- use the following artifactId if you don't need servlet 2.x compatibility -->
            <!-- artifactId>jersey-container-servlet</artifactId -->
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
        </dependency>
      
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-binding</artifactId>
        </dependency>
   
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
            <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>5.0.4.Final</version>
    </dependency>   
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->


    </dependencies>
    <properties>
        <jersey.version>2.29.1</jersey.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>