У меня есть сущность:Объектов сущностей ассоциации в JPA
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>
Зачем вам хранить «judID», «lawyerID», «clientID» в полях, когда у вас есть уже существующие объекты ?! –
Потому что я использую NamedQueries, для которого требуется идентификатор объекта id (не весь объект ...). В табличных случаях имеется несколько внешних ключей. И чтобы сделать какой-то выбор sql (конкретные случаи), мне нужно использовать внешние ключи. Могу ли я использовать поля объектов в именованных запросах? –
Конечно, вы можете использовать поля в JPQL, а NamedQueries - только JPQL! –