java - Hibernate HttpMessageNotWritableException -
i using hibernate 4.3.5 in spring mvc 4.2.3. have 2 model user
, client
, id
of user
foreign key of client
.
in user
class:
@repository @transactional public class userdaoimpl implements userdao { @autowired private sessionfactory sessionfactory; protected sessionfactory getsessionfactory() { try { return (sessionfactory) new initialcontext().lookup("sessionfactory"); } catch (exception e) { log.error("could not locate sessionfactory in jndi", e); throw new illegalstateexception("could not locate sessionfactory in jndi"); } } @onetomany(fetch = fetchtype.eager, mappedby = "user") public set<client> getclients() { return this.clients; } ...... }
and in client
, set:
@manytoone(fetch = fetchtype.lazy) @joincolumn(name = "user_id", nullable = false) public user getuser() { return this.user; }
the sessionfactory
defined in root-context.xml
. in way, should able clients
detached user
object, right? however, when ran code:
results.addall(userdao.findbyid(id).getclients());
it returned following exception:
warn : org.springframework.web.servlet.mvc.support.defaulthandlerexceptionresolver - failed write http message: org.springframework.http.converter.httpmessagenotwritableexception: not write content: infinite recursion (stackoverflowerror) (through reference chain: com.hersbitcloud.cancercloud.models.client["user"]->com.hersbitcloud.cancercloud.models.user["clientss"]->org.hibernate.collection.internal.persistentset[0]->com.hersbitcloud.cancercloud.models.client["user"]->com.hersbitcloud.cancercloud.models.user["clients"]->org.hibernate.collection.internal.persistentset[0]- java.lang.illegalstateexception: cannot call senderror() after response has been committed
the stack trace extremely long, think, means when user
, fetches client
@ same time because eager
. user
object fetched again inner object of client
, even set lazy
. process go , froth, never stop.
i understand lazy
fetch stuffs in session. question is, why session user
never expired?
it because models (entities) have bidirectional mapping. when jackson tries serialize objects faces user.getclients()[0].getuser().getclients()....
recursive chain. because directly use entities on presentation layer.
you can few things.
- use dtos
- use
@jsonignore
on entity directly (i don't prefer dao/mvc mixing) - may more options
this answer has better ways it
Comments
Post a Comment