0

so I read this topic: deserialize lazy loading in hibernate and jackson

and I would like to achieve similar - or actually - the same as previous author. However for two days now I am stuck and I do not understand my mistake.

So f.e I have this UserModel and AuthoritiesModel class for Hibernate entity:

UserModel:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "username")
@JsonAutoDetect
@Entity
@Table(name = "users")
public class UserModel implements Serializable, Cloneable {

    private static final long serialVersionUID = 8019466778684575940L;

    @Id
    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "enabled")
    private Boolean enabled;

    @Column(name = "email")
    private String email;

    @Column(name = "name")
    private String name;

    @Version
    @Column(name = "VERSION")
    private int version;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, targetEntity = AuthorityModel.class)
    private List<AuthorityModel> authorities = new ArrayList<AuthorityModel>();

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, targetEntity = MessageModel.class)
    private List<MessageModel> messages = new ArrayList<MessageModel>();

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = StatusModel.class)
    @JoinColumn(name = "status")
    private StatusModel status;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "meeting_user", joinColumns = { @JoinColumn(name = "username", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "id_meeting", nullable = false, updatable = false) })
    private List<MeetingModel> meetings = new ArrayList<MeetingModel>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "contact_user", joinColumns = @JoinColumn(name = "username", nullable = false, updatable = false), inverseJoinColumns = @JoinColumn(name = "contact_username", nullable = false, updatable = false))
    private List<UserModel> contacts = new ArrayList<UserModel>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "contact_user", joinColumns = @JoinColumn(name = "contact_username", nullable = false, updatable = false), inverseJoinColumns = @JoinColumn(name = "username", nullable = false, updatable = false))
    private List<UserModel> contactOf = new ArrayList<UserModel>();

AuthorityModel:

@JsonAutoDetect
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Entity
@Table(name = "authorities")
public class AuthorityModel extends BaseEntity implements GrantedAuthority {

    private static final long serialVersionUID = -3950709468104459415L;
    public static final String ROLE_USER = "ROLE_USER";
    public static final String ROLE_ADMIN = "ROLE_ADMIN";

    @Column(name = "authority")
    private String authority;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = UserModel.class)
    @JoinColumn(name = "username")
    private UserModel user;

And I am using Hibernate4Module to manage the entities but if I leave h.configure(Feature.FORCE_LAZY_LOADING, false); I end up with all the collections empty (null) like:

{
   "username":"rod",
   "password":"e97673c55fc4f2af8bf2122333df24ac",
   "enabled":true,
   "email":null,
   "name":null,
   "version":1,
   "authorities":null,
   "messages":null,
   "status":null,
   "meetings":null,
   "contacts":null,
   "contactOf":null
}

and if I make it Eager or h.configure(Feature.FORCE_LAZY_LOADING, true); I get my whole database loaded, like this:

{
   "username":"rod",
   "password":"e97673c55fc4f2af8bf2122333df24ac",
   "enabled":true,
   "email":null,
   "name":null,
   "version":1,
   "authorities":[
      {
         "id":"1",
         "version":0,
         "description":null,
         "comment":null,
         "authority":"ROLE_USER",
         "user":"rod"
      }
   ],
   "messages":[
      {
         "id":"1",
         "version":0,
         "description":null,
         "comment":null,
         "message":"TEST",
         "user":"rod",
         "meeting":{
            "id":"1",
            "version":0,
            "description":null,
            "comment":null,
            "users":[
               {
                  "username":"bob",
                  "password":"8ee3086749f7fa95ffe9c4588037cb10",
                  "enabled":true,
                  "email":null,
                  "name":null,
                  "version":1,
                  "authorities":[
                     {
                        "id":"2",
                        "version":0,
                        "description":null,
                        "comment":null,
                        "authority":"ROLE_ADMIN",
                        "user":"bob"
                     },
                     {
                        "id":"3",
                        "version":0,
                        "description":null,
                        "comment":null,
                        "authority":"ROLE_USER",
                        "user":"bob"
                     }
                  ],
                  "messages":[
                     {
                        "id":"2",
                        "version":0,
                        "description":null,
                        "comment":null,
                        "message":"TEST BACK",
                        "user":"bob",
                        "meeting":"1"
                     }
                  ],
                  "status":{
                     "id":"1",
                     "version":0,
                     "description":null,
                     "comment":null,
                     "status":"available",
                     "users":[
                        "bob",
                        "rod"
                     ]
                  },
                  "meetings":[
                     "1"
                  ],
                  "contacts":[
                     "rod"
                  ],
                  "contactOf":[
                     "rod"
                  ]
               },
               "rod"
            ],
            "messages":[
               "1",
               "2"
            ]
         }
      }
   ],
   "status":"1",
   "meetings":[
      "1"
   ],
   "contacts":[
      "bob"
   ],
   "contactOf":[
      "bob"
   ]
} 

Why is it loading everything, not only 1 collection deep? I would like to have the collections only with the ID of the referenced object or something similar, but I cant find the way to do so.

Any help appreciated!

--- to clarify i expect something similar to:

{
   "username":"rod",
   "password":"e97673c55fc4f2af8bf2122333df24ac",
   "enabled":true,
   "email":null,
   "name":null,
   "version":1,
   "authorities":[
      {
         "id":"1",
      }
   ],
   "messages":[
      {
         "id":"1",
      }
   ],
   "status":"1",
   "meetings":[
      "1"
   ],
   "contacts":[
      "bob"
   ],
   "contactOf":[
      "bob"
   ]
} 

1 Answer 1

1

Just remove the fetch = FetchType.LAZY from @JoinColumn annotation for the properties you want to have eagerly loaded and keep it for properties you don't want to fetch (Should be of Collection type).

Sign up to request clarification or add additional context in comments.

1 Comment

But I want all collections of the entity to be loaded. But not fully recursively up to the end of the database

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.