Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA中实体关联中的对象_Jpa_Jakarta Ee_Associations - Fatal编程技术网

JPA中实体关联中的对象

JPA中实体关联中的对象,jpa,jakarta-ee,associations,Jpa,Jakarta Ee,Associations,我有一个实体: package com.igorgorbunov3333.core.entities.domain; import javax.persistence.*; /** * Created by Игорь on 03.04.2016. */ @Entity @Table(name = "cases") public class Case { @Id @GeneratedVal

我有一个实体:

    package com.igorgorbunov3333.core.entities.domain;

    import javax.persistence.*;

    /**
     * Created by Игорь on 03.04.2016.
     */

    @Entity
    @Table(name = "cases")
    public class Case {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;

        private String caseNumber;

        private String dataI;

        private String dataII;

        private String dataIII;

        private long judgeID;

        private long lawyerID;

        private long clientID;

        @OneToOne
        @JoinColumn(name = "id")
        private Judge judge;

        @OneToOne
        @JoinColumn(name = "id")
        private Lawyer lawyer;

        @OneToOne
        @JoinColumn(name = "id")
        private Client client;

        @Enumerated(value = EnumType.ORDINAL)
        private CaseStatus statusI;

        @Enumerated(value = EnumType.ORDINAL)
        private CaseStatus statusII;

        @Enumerated(value = EnumType.ORDINAL)
        private CaseStatus statusIII;

        private String document;

        // getters and setters
    }
正如你所看到的,有三个对象:法官、律师和客户与我的实体相关。当我获取实体时,我得到一个错误:NullPointerException。因此,我被迫在CaseServiceImpl.java中实例化该对象以避免异常:

public Case findById(long id) {
    Case c = entityManager.find(Case.class, id);
    c.setJudge(new JudgeServiceImpl().findById(c.getJudgeID()));
    c.setClient(new ClientServiceImpl().findById(c.getClientID()));
    c.setLawyer(new LawyerServiceImpl().findById(c.getLawyerID()));
    return c;
}
这样做对吗? 我的JSP页面代码:

<%@ page import="com.igorgorbunov3333.core.entities.domain.Case" %>
<%@ page import="java.util.List" %>

<%@ page contentType="text/html; charset=UTF-8" language="java" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<fmt:requestEncoding value="UTF-8"/>

<%-- HEADER --%>

<c:import url="/common/header.jsp">
    <c:param name="title" value="Cases"/>
    <c:param name="a" value="Дела"/>
</c:import>

<%-- BODY --%>

<div class="table-header">
    <div class="first-header-element">№</div>
    <div class="header-element">Номер дела</div>
    <div class="header-element">Представитель</div>
    <div class="header-element">Клиент</div>
    <div class="last-header-element"></div>
</div>

<br>

<%List<Case> cases = (List<Case>) request.getAttribute("cases");
  int count = 0;
  for (Case c : cases) {%>
<div style="text-align: center">
    <label>
        <textarea class="first-element" readonly><%= ++count%></textarea>
    </label>
    <label>
        <textarea class="element" readonly><%= c.getCaseNumber()%></textarea>
    </label>
    <label>
        <textarea class="element" readonly><%= c.getLawyer().getLawyerName()%></textarea>
    </label>
    <label>
        <textarea class="element" readonly><%= c.getClient().getClientName()%></textarea>
    </label>
    <a href="${pageContext.request.contextPath}/showSingleCase?caseID=<%=c.getId()%>"><label>
        <input type="button" class="button" value="Детальней" style="width: 10%">
    </label></a>
</div>
<%}%>

<%-- FOOTER --%>

<c:import url="/common/footer.jsp">
</c:import>

№
Номер дела
Представитель
Клиент

字符串处发生错误:

<textarea class="element" readonly><%= c.getLawyer().getLawyerName()%></textarea>


我发现您在
实体类
中缺少工具
序列化
,或者已经为
实体
类创建了接口。smth类似于
CaseRepository
接口
,您可以在其中声明方法“
findById
”,因为我假设
jpa
通过id获取的默认方法是“
getById
”,因此这可能是您试图创建的自定义方法

既然已经存在实际对象,为什么还要在字段中存储“法官ID”、“律师ID”、“客户ID”?!因为我使用的是namedquerys,它需要对象id-s(不是整个对象…)。表大小写包含很少的外键。为了进行一些sql选择(具体情况),我需要使用外键。我可以在命名查询中使用对象字段吗?当然可以在JPQL中使用字段,而命名查询就是JPQL@NeilStockton没问题,但我仍然有一个错误,因为我必须在case实体中实例化对象(当我在JSP页面中获取实体时)!什么持久性提供者?如果您是在JSP中访问,则可能由于延迟加载而未初始化关联。因此,在这种情况下,提供程序可能会抛出延迟加载异常。其他(OpenJPA)可能会简单地返回null。在服务中调用c.getJudge()返回什么