Hibernate @ManytoOne问题

时间:2018-02-19 22:29:21

标签: java json hibernate jsp arraylist

我真的很陌生,我目前正在使用hibernate框架开展大学项目。我目前正在努力实现的是能够获得List<> Graveowners并转换为json字符串,然后将其发送到前端并进行处理。我不知道自己做错了什么,而且当谈到json等技术时,我并不是最好的。这就是我在class Graveowners中所拥有的:

Entity
@Table(name="graveowner"
    ,catalog="dspc_explorer"
)
public class Graveowner  implements java.io.Serializable {

     private int graveId;
     private Section section;
     private String graveRefCode;
     private String graveOwnerName;
     private String graveOwnerAddress;
     private Date graveopenDate;
     private int graveRow;
     private int graveDepth;
     private String graveLocation;
     private byte[] graveImage;
     private Set<Registrar> registrars = new HashSet<Registrar>(0);

    public Graveowner() {
    }

    public Graveowner(int graveId, Section section, int graveRow, int graveDepth) {
        this.graveId = graveId;
        this.section = section;
        this.graveRow = graveRow;
        this.graveDepth = graveDepth;
    }

    public Graveowner(int graveId, Section section, String graveRefCode, String graveOwnerName, String graveOwnerAddress, Date graveopenDate, int graveRow, int graveDepth, String graveLocation, byte[] graveImage, Set<Registrar> registrars) {
       this.graveId = graveId;
       this.section = section;
       this.graveRefCode = graveRefCode;
       this.graveOwnerName = graveOwnerName;
       this.graveOwnerAddress = graveOwnerAddress;
       this.graveopenDate = graveopenDate;
       this.graveRow = graveRow;
       this.graveDepth = graveDepth;
       this.graveLocation = graveLocation;
       this.graveImage = graveImage;
       this.registrars = registrars;
    }

    @Id 

    @Column(name="grave_id", unique=true, nullable=false)
    public int getGraveId() {
        return this.graveId;
    }

    public void setGraveId(int graveId) {
        this.graveId = graveId;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="sectionId", nullable=false)
    public Section getSection() {
        return this.section;
    }

    public void setSection(Section section) {
        this.section = section;
    }

    @Column(name="grave_ref_code", length=50)
    public String getGraveRefCode() {
        return this.graveRefCode;
    }

    public void setGraveRefCode(String graveRefCode) {
        this.graveRefCode = graveRefCode;
    }

    @Column(name="grave_owner_name", length=100)
    public String getGraveOwnerName() {
        return this.graveOwnerName;
    }

    public void setGraveOwnerName(String graveOwnerName) {
        this.graveOwnerName = graveOwnerName;
    }

    @Column(name="grave_owner_address", length=150)
    public String getGraveOwnerAddress() {
        return this.graveOwnerAddress;
    }

    public void setGraveOwnerAddress(String graveOwnerAddress) {
        this.graveOwnerAddress = graveOwnerAddress;
    }

    @Temporal(TemporalType.DATE)
    @Column(name="graveopen_date", length=10)
    public Date getGraveopenDate() {
        return this.graveopenDate;
    }

    public void setGraveopenDate(Date graveopenDate) {
        this.graveopenDate = graveopenDate;
    }

    @Column(name="grave_row", nullable=false)
    public int getGraveRow() {
        return this.graveRow;
    }

    public void setGraveRow(int graveRow) {
        this.graveRow = graveRow;
    }

    @Column(name="grave_depth", nullable=false)
    public int getGraveDepth() {
        return this.graveDepth;
    }

    public void setGraveDepth(int graveDepth) {
        this.graveDepth = graveDepth;
    }

    @Column(name="grave_location", length=100)
    public String getGraveLocation() {
        return this.graveLocation;
    }

    public void setGraveLocation(String graveLocation) {
        this.graveLocation = graveLocation;
    }

    @Column(name="grave_image")
    public byte[] getGraveImage() {
        return this.graveImage;
    }

    public void setGraveImage(byte[] graveImage) {
        this.graveImage = graveImage;
    }

@OneToMany(fetch=FetchType.LAZY, mappedBy="graveowner.graveId")
    public Set<Registrar> getRegistrars() {
        return this.registrars;
    }

    public void setRegistrars(Set<Registrar> registrars) {
        this.registrars = registrars;
    }
}

然后在我的Dao课程中,我目前有这种方法来检索List<Graveowners>

@Override
public List<Graveowner> getAllgraveOwners() {
    try {
        session = HibernateUtil.getSessionFactory().openSession();

        tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Graveowner.class);
        criteria.setFetchMode("section", FetchMode.JOIN)
                .setFetchMode("registrars", FetchMode.JOIN);
        List<Graveowner> graveOwnersList = criteria.list();

        tx.commit();
        return graveOwnersList;
    } catch (HibernateException e) {
        try {
            tx.rollback();
        } catch (RuntimeException r) {
            System.out.println("Can't rollback transaction");
        }
        throw e;
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

然后我有一个处理HTTPrequests, HTTPresponse的命令类:

  public void execute(HttpServletRequest request, HttpServletResponse response) {
    HttpSession session = request.getSession(true);
    Users user = (Users) request.getSession().getAttribute("user");
    RequestDispatcher dispatcher;
    try {
        if (user != null) {
            if (user.getUserType() == 0) {
                UserServices userservice = new UserServices();
                List<Graveowner> list = (ArrayList<Graveowner>) userservice.getAllGraveowner();
                GeneralServices generalService = new GeneralServices();
                generalService.printArrayList((ArrayList) list);

                String jsonStringUserList = new Gson().toJson(list, Graveowner.class);
                System.out.println(jsonStringUserList);
                if (list != null) {
                    session.setAttribute("list", list);
                    session.setAttribute("jsonStringUserList", jsonStringUserList);
                    session.setAttribute("status", 0);
                    session.setAttribute("statusMessage", "List Users success");
                    dispatcher = getServletContext().getRequestDispatcher("ManageGraveOwner.jsp");
                } else {
                    System.out.println("Empty List");
                    session.setAttribute("status", 1);
                    session.setAttribute("statusMessage", "List Users service failed or No users in database");
                    dispatcher = getServletContext().getRequestDispatcher("ProcessResult.jsp");
                }
            } else {
                session.setAttribute("status", 2);
                session.setAttribute("statusMessage", "No valid user logged in (Need Admin rights for this action)");
                dispatcher = getServletContext().getRequestDispatcher("ProcessResult.jsp");

            }
        } else {
            session.setAttribute("status", 3);
            session.setAttribute("statusMessage", "Session expired.. ");
            dispatcher = getServletContext().getRequestDispatcher("/SessionExpired.jsp");
        }
        dispatcher.forward(request, response);

    } catch (ServletException | IOException ex) {
        Logger.getLogger(LoginUserCommand.class.getName()).log(Level.SEVERE, null, ex);
    }
}

当我实际运行项目时,我目前收到以下错误..

    Info:   manageGraveowner
Info:   Hibernate: select this_.grave_id as grave_id1_0_2_, this_.sectionId as sectionI2_0_2_, this_.grave_ref_code as grave_re3_0_2_, this_.grave_owner_name as grave_ow4_0_2_, this_.grave_owner_address as grave_ow5_0_2_, this_.graveopen_date as graveope6_0_2_, this_.grave_row as grave_ro7_0_2_, this_.grave_depth as grave_de8_0_2_, this_.grave_location as grave_lo9_0_2_, this_.grave_image as grave_i10_0_2_, section2_.sectionId as sectionI1_2_0_, section2_.sectionCode as sectionC2_2_0_, section2_.dateOpened as dateOpen3_2_0_, section2_.graveCount as graveCou4_2_0_, registrars3_.graveId as graveId2_0_4_, registrars3_.reg_id as reg_id1_1_4_, registrars3_.reg_id as reg_id1_1_1_, registrars3_.graveId as graveId2_1_1_, registrars3_.reg_first_name as reg_firs3_1_1_, registrars3_.reg_middle_name as reg_midd4_1_1_, registrars3_.reg_last_name as reg_last5_1_1_, registrars3_.reg_sex as reg_sex6_1_1_, registrars3_.reg_age as reg_age7_1_1_, registrars3_.reg_religion as reg_reli8_1_1_, registrars3_.reg_occupation as reg_occu9_1_1_, registrars3_.reg_death_location as reg_dea10_1_1_, registrars3_.reg_marriage_status as reg_mar11_1_1_, registrars3_.regdeath_date as regdeat12_1_1_, registrars3_.regburial_date as regburi13_1_1_ from dspc_explorer.graveowner this_ inner join dspc_explorer.section section2_ on this_.sectionId=section2_.sectionId left outer join dspc_explorer.registrar registrars3_ on this_.grave_id=registrars3_.graveId
Info:   com.dspc_explorer.Dtos.Graveowner@1c225fa9
Info:   com.dspc_explorer.Dtos.Graveowner@6e802ad6
Info:   com.dspc_explorer.Dtos.Graveowner@6e802ad6
Info:   com.dspc_explorer.Dtos.Graveowner@4ee74a73
Warning:   StandardWrapperValve[WebActionServlet]: Servlet.service() for servlet WebActionServlet threw exception
java.lang.IllegalArgumentException: Can not set int field com.dspc_explorer.Dtos.Graveowner.graveId to java.util.ArrayList
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:56)
    at sun.reflect.UnsafeIntegerFieldAccessorImpl.get(UnsafeIntegerFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:393)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:86)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    at com.google.gson.Gson.toJson(Gson.java:586)
    at com.google.gson.Gson.toJson(Gson.java:565)
    at com.google.gson.Gson.toJson(Gson.java:520)
    at com.dspc_explorer.Commands.ManageGraveOwnerCommand.execute(ManageGraveOwnerCommand.java:46)
    at com.dspc_explorer.servlet.WebActionServlet.processRequest(WebActionServlet.java:39)
    at com.dspc_explorer.servlet.WebActionServlet.doPost(WebActionServlet.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:748)

我现在真的很困惑,花了很长时间才想弄明白,所以决定报名并寻求帮助:(。我会感激任何帮助,非常感谢。提前致谢

1 个答案:

答案 0 :(得分:0)

问题在于

的第二个参数
Gson.toJson()

实际上你不需要第二个参数。