Quantcast
Channel: SCN : Popular Discussions - SAP HANA Cloud Platform Developer Center
Viewing all articles
Browse latest Browse all 1318

JPA ManyToMany with Eclipselink & GSON circular reference causing a stack overflow after server restart

$
0
0

I have an issue with a manytomany bi-directional JPA relationship that is causing a stack overflow error

when the server is restarted (if there is data in the 3 tables that comprise the manytomany relationship.)

 

While I have a total of 5 entities in my application, I believe the issue is only related to

the Users and Application entities which use use a bi-directional manytomany relationship.

I have included the JPA diagram containing all entities for completeness


jpaentities.PNG



Below are the 2 entities that I believe are causing my circular reference stack overflow:

 

Application 

User

 

An Application can have many developers

A User can develop many applications

 

Here is how they are mapped:

 

//Application Entity:

 

    @ManyToMany

 

    private List<Users> users

 

//User Entity

   @ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)

 

     private List <Applications> applications;

 

This results in 3 tables being created in the database as shown below:

APPLICATIONS

APPLICATION_USERS <  Join table created by JPA when using a ManyToMany relationship.

USERS

  

The application works fine when it is first deployed with empty tables.

A user registers for an application and this creates a row in the APPLICATIONS table (if the Application does not exist)

A row is also created in the USERS table if the user does not exist and the join table APPLICATION_USERS

is populated with the ID FROM THE APPLICATION Table called APPLICATIONS_ID and

an ID from the USERS table called USERS_ID as shown above.

 

You can add as many applications or users as you wish and the application works perfectly.

I have verified that data is being loaded and persisted into the 3 tables exactly as expected

 

Here is an example of the data in the tables after a user registers an Application:


tables.PNG

 

 

Here is the problem:

Whenever the server is stopped and restarted or when the application is re-deployed using create-tables

(vs drop-and-create-tables) (and data is present in the tables). Application gets a stack overflow at each entities toString() function.

I have run this in debug with a breakpoints on the Applications toString() function and on the Users toString() function and I can click resume and watch each toString() function get called over and over until the stack overflow results.

 

 

Application.PNG

 

 

 

user.PNG

 

Here is the console log:

 

//Entity query being executed

[EL Fine]: 2014-01-21 14:48:44.383--ServerSession(1615948530)--Connection(49767657)--Thread(Thread[http-bio-8080-exec-9,5,main])--SELECT t1.ID, t1.APPIDENTIFIER, t1.DATECREATED, t1.DATEMODIFIED, t1.DEVICETYPE FROM APPLICATIONS_Users t0, APPLICATIONS t1 WHERE ((t0.users_ID = ?) AND (t1.ID = t0.applications_ID))

 

//second entity query is invoked

 

[EL Fine]: 2014-01-21 14:50:02.444--ServerSession(1615948530)--Connection(1871047709)--Thread(Thread[http-bio-8080-exec-9,5,main])--SELECT t1.ID, t1.DATECREATED, t1.DATEMODIFIED, t1.EMAIL, t1.FIRSTNAME, t1.FULLNAME, t1.LASTLOGINDATE, t1.LASTNAME, t1.USERNAME FROM APPLICATIONS_Users t0, Users t1 WHERE ((t0.applications_ID = ?) AND (t1.ID = t0.users_ID))

 

     

[EL Finest]: 2014-01-21 14:50:02.471--ServerSession(1615948530)--Connection(1601422824)--Thread(Thread[http-bio-8080-exec-9,5,main])--Connection released to connection pool [read].

 

  1. java.lang.StackOverflowError

 

       at java.util.Vector.get(Vector.java:693)

 

       at java.util.AbstractList$Itr.next(AbstractList.java:345)

 

       at java.util.AbstractCollection.toString(AbstractCollection.java:421)

 

       at java.util.Vector.toString(Vector.java:940)

 

       at org.eclipse.persistence.indirection.IndirectList.toString(IndirectList.java:797)

 

       at java.lang.String.valueOf(String.java:2826)

 

       at java.lang.StringBuilder.append(StringBuilder.java:115)

 

       at com.sap.crashlogserver.dao.entities.Applications.toString(Applications.java:150)

 

       at java.lang.String.valueOf(String.java:2826)

 

       at java.lang.StringBuilder.append(StringBuilder.java:115)

 

       at java.util.AbstractCollection.toString(AbstractCollection.java:422)

 

       at java.util.Vector.toString(Vector.java:940)

 

       at org.eclipse.persistence.indirection.IndirectList.toString(IndirectList.java:797)

 

       at java.lang.String.valueOf(String.java:2826)

 

       at java.lang.StringBuilder.append(StringBuilder.java:115)

 

       at com.sap.crashlogserver.dao.entities.Users.toString(Users.java:168)

 

       at java.lang.String.valueOf(String.java:2826)

 

       at java.lang.StringBuilder.append(StringBuilder.java:115)

 

       at java.util.AbstractCollection.toString(AbstractCollection.java:422)

 

       at java.util.Vector.toString(Vector.java:940)

 

       at org.eclipse.persistence.indirection.IndirectList.toString(IndirectList.java:797)

 

       at java.lang.String.valueOf(String.java:2826)

 

       at java.lang.StringBuilder.append(StringBuilder.java:115)

 

       at com.sap.crashlogserver.dao.entities.Applications.toString(Applications.java:150)

 

       at java.lang.String.valueOf(String.java:2826)

 

       at java.lang.StringBuilder.append(StringBuilder.java:115)

 

       at java.util.AbstractCollection.toString(AbstractCollection.java:422)

 

       at java.util.Vector.toString(Vector.java:940)

 

 

Based on a number of threads I have read I tried:

  1. reversing the mappings,
  2. Adding @JsonIgnoreputting to some of the entity fields
  3. using fetch = FetchType.LAZY

 

and many other config tweaks but none of them resolved this issue.

Some of the suggestions like using transient fields I am not sure are supported in the JPA implemenation of eclipselink.

 

I also read a thread said that I should implement gson.ExclusionStrategy but I have not tried this yet.

GSONEXCLUDE.PNG

 

I am new to Java and JPA and greatly appreciate any suggestions you may have to help me resolve this issue.


Viewing all articles
Browse latest Browse all 1318

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>