Friday 15 April 2011

java - JsonMappingException with Arrays of object in spring-jpa -



java - JsonMappingException with Arrays of object in spring-jpa -

i error when seek item dbms. next error

com.fasterxml.jackson.databind.jsonmappingexception: failed lazily initialize collection of role: com.pharmawizardcabinet.core.entity.cabinet.cabinet.listafarmaci, not initialize proxy - no session (through reference chain: com.pharmawizardcabinet.web.beans.responsecabinet["cabinet"]->com.pharmawizardcabinet.core.entity.cabinet.cabinet["listafarmaci"])

this conteiner

@entity @table(name = "cabinet") public class cabinet implements serializable { private static final long serialversionuid = 7311927404447970875l; @id @column(name = "id") @generatedvalue(strategy = generationtype.auto) private long id; @onetomany(cascade = cascadetype.all, mappedby = "cabinet") private list<farmaco> listafarmaci; @onetoone(cascade = cascadetype.all, fetch = fetchtype.lazy) @joincolumn(name = "user") private user user; @column(name = "timestamp") @temporal(temporaltype.date) private date setlastmodified; public cabinet() { } @postpersist @postupdate private void setlastupdate() { this.setlastmodified = new date(); } public list<farmaco> getlistafarmaci() { homecoming listafarmaci; } public void setlistafarmaci(list<farmaco> listafarmaci) { this.listafarmaci = listafarmaci; } public user getuser() { homecoming user; } public void setuser(user user) { this.user = user; } public long getid() { homecoming id; } public void setid(long id) { id = id; } public date getsetlastmodified() { homecoming setlastmodified; } public void setsetlastmodified(date setlastmodified) { this.setlastmodified = setlastmodified; } }

and item

@entity @table(name = "farmaco") public class farmaco implements serializable { private static final long serialversionuid = -152536676742398255l; public farmaco() { // todo auto-generated constructor stub } @column(name = "nome_farmaco") private string nome; @column(name = "codice") private string codice; @column(name = "azienda") private string azienda; @id @column(name = "id") @generatedvalue(strategy = generationtype.auto) private long id; @column(name = "scadenza") @temporal(temporaltype.date) private date scadenza; @enumerated(enumtype.string) @column(name = "posologia") private posologia posologia; @column(name = "quantita") private integer quantita; @onetoone(cascade = cascadetype.all, fetch = fetchtype.lazy) @joincolumn(name = "note") private note note; @manytoone(cascade =cascadetype.all, fetch = fetchtype.lazy) @joincolumn(name = "cabinet_id") private cabinet cabinet; public string getnome() { homecoming nome; } public void setnome(string nome) { this.nome = nome; } public string getcodice() { homecoming codice; } public void setcodice(string codice) { this.codice = codice; } public string getazienda() { homecoming azienda; } public void setazienda(string azienda) { this.azienda = azienda; } public long getid() { homecoming id; } public void setid(long id) { id = id; } public date getscadenza() { homecoming scadenza; } public void setscadenza(date scadenza) { this.scadenza = scadenza; } public posologia getposologia() { homecoming posologia; } public void setposologia(posologia posologia) { this.posologia = posologia; } public integer getquantita() { homecoming quantita; } public void setquantita(integer quantita) { this.quantita = quantita; } public note getnote() { homecoming note; } public void setnote(note note) { this.note = note; } public cabinet getcabinet() { homecoming cabinet; } public void setcabinet(cabinet cabinet) { this.cabinet = cabinet; } }

controller this

@component("managercabinet") public class managercabinet { private static logger logger = logger.getlogger(managercabinet.class); @persistencecontext(name = "pwcabinet-jpa") private entitymanager entitymanager; @transactional public cabinet getcabinetbyuser(user user) { logger.debug("[getcabinetbyuser] user: " + user.getid()); homecoming _getcabinetbyuser(user); } private cabinet _getcabinetbyuser(user user) { logger.debug("[_getcabinetbyuser] user: " + user.getid()); user find = entitymanager.find(user.class, user.getid()); query searchcabinetbyuser = entitymanager.createquery("select c cabinet c c.user = :userid", cabinet.class); searchcabinetbyuser.setparameter("userid", find); cabinet cabinetsearch = (cabinet) searchcabinetbyuser.getsingleresult(); cabinetsearch.setuser(find); homecoming cabinetsearch; } }

but go on error.

if utilize annotation @jsonignore in way

@jsonignore public list<farmaco> getlistafarmaci() { homecoming listafarmaci; }

they works, need info in result. how solve it?

when method private cabinet _getcabinetbyuser(user user) returns cabinet instance in 'detached' state, viz. no longer associated persistence context.

when item in detached state non-eagerly fetched associations can longer accessed.

as default fetch @onetomany lazy in case

@onetomany(cascade = cascadetype.all, mappedby = "cabinet") private list<farmaco> listafarmaci;

the field listafarmaci can no longer accessed 1 time loaded cabinet detached persistence context.

you have various means of dealing include:

marking field beingness eagerly fetched (not eagerly fetched regardless of whether required or not). forcing persistence context remain open until processing done typically referred opensessioninview pattern (or anti-pattern) depending on point of view: http://java.dzone.com/articles/open-session-view-design ensuring info required utilize case initialized before detachment. there various ways of achieving this:

simply accessing collection way e.g. calling size() may not work jpa providers.

specifying fetch bring together in jpql query loads cabinet (although has side effects). http://en.wikibooks.org/wiki/java_persistence/relationships#join_fetching

java spring jpa jackson

No comments:

Post a Comment