0

I have a problem with GW and Hibernate.

In my database , I have Sinav(Exam) and Soru(Question) tables and a mid-table called sinav_soru(Exam_Question). When I want to reach the exam list from the database using Hibernate the error occurs.

Here's the error detail

   [WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentBag' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [tr.edu.gsu.yds.shared.domain.Soru@307262ee]
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:709)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:748)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44)
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39)
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51)
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539)
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616)
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

Really I couldn't fix the problem.

here's my domain code given below:

Sinav.java (Exam)

package tr.edu.gsu.yds.shared.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "sinav")
public class Sinav implements Serializable
{
    private static final long serialVersionUID = 1L;

    private Integer sinavId;
    private String sinavAd;
    private String eklenmeTarihi;
    private Ogretmen ogretmen;
    private List<Ogrenci> ogrenciler = new ArrayList<Ogrenci>();
    private List<Soru> sorular = new ArrayList<Soru>();

    @Id
    @GeneratedValue( strategy=GenerationType.IDENTITY )
    @Column(name = "sinavId", length=10)
    public Integer getSinavId() {
        return sinavId;
    }

    public void setSinavId(Integer sinavId) {
        this.sinavId = sinavId;
    }

    @Column(name = "sinavAd", nullable = false)
    public String getSinavAd() {
        return sinavAd;
    }

    public void setSinavAd(String sinavAd) {
        this.sinavAd = sinavAd;
    }

    @Column(name = "eklenmeTarihi", nullable = false)
    public String getEklenmeTarihi() {
        return eklenmeTarihi;
    }


    public void setEklenmeTarihi(String eklenmeTarihi) {
        this.eklenmeTarihi = eklenmeTarihi;
    }



    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "ogretmenNo")
    public Ogretmen getOgretmen() {
        return this.ogretmen;
    }

    public void setOgretmen(Ogretmen ogretmen) {
        this.ogretmen = ogretmen;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "sinav")
    public List<Ogrenci> getOgrenciler()
    {
        return ogrenciler;
    }

    public void setOgrenciler( List<Ogrenci> ogrenciler )
    {
        this.ogrenciler = ogrenciler;
    }


    @ManyToMany(fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "sinav_soru",
        joinColumns = {
            @JoinColumn(name = "sinavId", nullable = false)
        },
        inverseJoinColumns = {
            @JoinColumn(name = "soruId", nullable = false)
        }
    )
    public List<Soru> getSorular() {
        return sorular;
    }

    public void setSorular(List<Soru> sorular) {
        this.sorular = sorular;
    }


}

Soru.java (Question)

package tr.edu.gsu.yds.shared.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "soru")
public class Soru implements Serializable
{
    private static final long serialVersionUID = 4L;

    private Integer soruId;
    private String soruTip;
    private String soruMetin;
    private String soruYardimci;
    private Integer soruPuan;
    private List<Cevap> cevaplar = new ArrayList<Cevap>();
    private List<Sinav> sinavlar = new ArrayList<Sinav>();

    @Id
    @GeneratedValue( strategy=GenerationType.IDENTITY )
    @Column(name = "soruId")
    public Integer getSoruId() {
        return soruId;
    }

    public void setSoruId(Integer soruId) {
        this.soruId = soruId;
    }

    @Column( name = "soruTip", nullable = false, length=20 )
    public String getSoruTip() {
        return soruTip;
    }

    public void setSoruTip( String soruTip ) {
        this.soruTip = soruTip;
    }

    @Column( name = "soruMetin", nullable = false, length = 65535, columnDefinition="Text" )
    public String getSoruMetin() {
        return soruMetin;
    }

    public void setSoruMetin( String soruMetin ) {
        this.soruMetin = soruMetin;
    }

    @Column( name = "soruYardimci", nullable = false, length=45 )
    public String getSoruYardimci() {
        return soruYardimci;
    }

    public void setSoruYardimci( String soruYardimci ) {
        this.soruYardimci = soruYardimci;
    }

    @Column( name = "soruPuan", nullable = false, length=3 )
    public Integer getSoruPuan() {
        return soruPuan;
    }

    public void setSoruPuan( Integer soruPuan ) {
        this.soruPuan = soruPuan;
    }

    @OneToMany( mappedBy = "soru", fetch = FetchType.EAGER, cascade=CascadeType.ALL )
    public List<Cevap> getCevaplar() {
        return cevaplar;
    }

    public void setCevaplar( List<Cevap> cevaplar ) {
        this.cevaplar = cevaplar;
    }

    @ManyToMany( mappedBy = "sorular", fetch = FetchType.LAZY )
    public List<Sinav> getSinavlar() {
        return sinavlar;
    }

    public void setSinavlar(List<Sinav> sinavlar) {
        this.sinavlar = sinavlar;
    }

}

Here's the code that i get the exam list ;

package tr.edu.gsu.yds.client.controller.ogrenci;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;

import tr.edu.gsu.yds.client.remote.YdsRemoteService;
import tr.edu.gsu.yds.client.remote.YdsRemoteServiceAsync;
import tr.edu.gsu.yds.client.view.ogrenci.sinavislemleri.OgrenciWritingSoruSayfasi;
import tr.edu.gsu.yds.shared.domain.Sinav;
import tr.edu.gsu.yds.shared.domain.SinavTakvim;
import tr.edu.gsu.yds.shared.domain.Soru;

public class OgrenciWritingSoruSayfasiController
{

    private YdsRemoteServiceAsync   ydsRemoteServiceAsync   = GWT.create( YdsRemoteService.class );
    private OgrenciWritingSoruSayfasi ogrenciWritingSoruSayfasi;

    public OgrenciWritingSoruSayfasiController( OgrenciWritingSoruSayfasi ogrenciWritingSoruSayfasi )
    {
        this.ogrenciWritingSoruSayfasi = ogrenciWritingSoruSayfasi;

    }

    public void send(){

        ydsRemoteServiceAsync.getSinavList( new AsyncCallback<List<Sinav>>()
        {

            @Override
            public void onSuccess( List<Sinav> result )
            {
                for ( Sinav sinav : result )
                {
                    //Just to see , returning results.
                    Window.alert( "sinav " + sinav.getSinavId() );

                }               
            }

            @Override
            public void onFailure( Throwable caught )
            {
                Window.alert( "Failure" );

            }
        } );
        ogrenciWritingSoruSayfasi.getOgrenciWritingWidget().getOkayButton().addClickHandler( new ClickHandler()
        {

            @Override
            public void onClick( ClickEvent event )
            {
                ogrenciWritingSoruSayfasi.getOgrenciWritingWidget().getSoruMetniLabel().setText( "Basıldı" );

            }
        } );


    }

}
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129

3 Answers3

0

Swap these:

  private List<Ogrenci> ogrenciler = new ArrayList<Ogrenci>();
private List<Soru> sorular = new ArrayList<Soru>();

With:

  private Set<Ogrenci> ogrenciler = new HashSet<Ogrenci>();
private Set<Soru> sorular = new HashSet<Soru>();

And similarly the lists in the other Entity class.

Check out this link: Serializable Hibernate data object for GWT RPC

Community
  • 1
  • 1
barsju
  • 4,408
  • 1
  • 19
  • 24
  • that also did not solve the problem , but the error changed to; Type 'org.hibernate.collection.PersistentSet' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [tr.edu.gsu.yds.shared.domain.Soru@7c224fcc] **----> PersistentBag changed to PersistentSet** – user1204013 Apr 08 '12 at 19:35
0

I'm not sure but according to I read from other question's answers you forget to add your default(zero) argument constructor. Can you try again after adding this.

mbaydar
  • 1,144
  • 1
  • 13
  • 18
0

Omit theses Variables and their respective methods it will not work with GWT.

private List<Ogrenci> ogrenciler = new ArrayList<Ogrenci>();
private List<Soru> sorular = new ArrayList<Soru>();

neither

private Set<Ogrenci> ogrenciler = new HashSet<Ogrenci>();
private Set<Soru> sorular = new HashSet<Soru>();

Theres different solutions are available i.e dozer, Gilead etc. Also you can use getbyids methods for getting these results for simplification.

Shehzad
  • 2,870
  • 17
  • 21