In my program i have 3 entities Group,Teams,Employees. Where Teams comes under Group and Employees comes either directly under Group or Team. When I write query to find employees under a team using teamId I get below error.
javax.persistence.EntityNotFoundException: Unable to find com.lss.loop.model.Teams with id 3
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$JpaEntityNotFoundDelegate.handleEntityNotFound(EntityManagerFactoryBuilderImpl.java:163)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:216)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:110)
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1186)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1051)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:697)
at org.hibernate.type.EntityType.resolve(EntityType.java:464)
at org.hibernate.type.ManyToOneType.resolve(ManyToOneType.java:240)
at org.hibernate.engine.internal.TwoPhaseLoad$EntityResolver.lambda$static$0(TwoPhaseLoad.java:576)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntityEntryLoadedState(TwoPhaseLoad.java:221)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:155)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:126)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1193)
at org.hibernate.loader.Loader.processResultSet(Loader.java:1001)
at org.hibernate.loader.Loader.doQuery(Loader.java:959)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
at org.hibernate.loader.Loader.doList(Loader.java:2843)
at org.hibernate.loader.Loader.doList(Loader.java:2825)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2657)
at org.hibernate.loader.Loader.list(Loader.java:2652)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1636)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1604)
at com.lss.loopschoolsecond.service.LoopService.getTeamParticipatingStatusEvents(LoopService.java:11322)
at com.lss.loopschoolsecond.service.LoopService$$FastClassBySpringCGLIB$$ecf8f0e5.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692)
at com.lss.loopschoolsecond.service.LoopService$$EnhancerBySpringCGLIB$$eb9065bd.getTeamParticipatingStatusEvents(<generated>)
at com.lss.loopschoolsecond.controller.LoopController.getTeamParticipatingStatusEvents(LoopController.java:16179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
I checked database and confirmed there is a record on Team table with id = 3 and a set of employees with teamId as 3.Below is my code.
List<Employees> employeeList = new ArrayList<Employees>();
Query query = session.createQuery("FROM Employees where teamId.id = :teamId and active = 1");
query.setParameter("teamId", teamId);
employeeList = query.list();
If I run below query in mysql i am getting the required result.
SELECT * FROM employees where team_id = 3 and active = 1
Below are my classes.
Employees.java :
@Entity
@Table(name = "employees")
public class Employees implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@JoinColumn(name = "event_id", referencedColumnName = "id", nullable = true)
@ManyToOne
private Group groupId;
@JoinColumn(name = "team_id", referencedColumnName = "id", nullable = true)
@ManyToOne(optional = true)
private Teams teamId;
@Column(name="type")
private int type;
@JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
@OneToOne(optional = false)
private UserStaff userId;
@Column(name="approval_status")
private int approvalStatus;
@Column(name = "approval_date")
@JsonAdapter(DateJsonSerializer.class)
private Date approvalDate;
@Column(name = "comments")
private String comments;
@Column(name="active")
private boolean active;
public Employees() {
}
public Employees(long id, Group groupId, Teams teamId, int type, UserStaff userId, int approvalStatus, Date approvalDate, String comments, boolean active) {
this.id = id;
this.groupId = groupId;
this.teamId = teamId;
this.type = type;
this.userId = userId;
this.approvalStatus = approvalStatus;
this.approvalDate = approvalDate;
this.comments = comments;
this.active = active;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Group getGroupId() {
return groupId;
}
public void setGroupId(Group groupId) {
this.groupId = groupId;
}
public Teams getTeamId() {
return teamId;
}
public void setTeamId(Teams teamId) {
this.teamId = teamId;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public UserStaff getUserId() {
return userId;
}
public void setUserId(UserStaff userId) {
this.userId = userId;
}
public int getApprovalStatus() {
return approvalStatus;
}
public void setApprovalStatus(int approvalStatus) {
this.approvalStatus = approvalStatus;
}
public Date getApprovalDate() {
return approvalDate;
}
public void setApprovalDate(Date approvalDate) {
this.approvalDate = approvalDate;
}
public String getComments() {
return comments;
}
public void setComments(String comments) {
this.comments = comments;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employees that = (Employees) o;
return id == that.id &&
type == that.type &&
approvalStatus == that.approvalStatus &&
active == that.active &&
Objects.equals(groupId, that.groupId) &&
Objects.equals(teamId, that.teamId) &&
Objects.equals(userId, that.userId) &&
Objects.equals(approvalDate, that.approvalDate) &&
Objects.equals(comments, that.comments);
}
@Override
public int hashCode() {
return Objects.hash(id, groupId, teamId, type, userId, approvalStatus, approvalDate, comments, active);
}
}
Teams.java:
@Entity
@Table(name = "teams")
public class Teams implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@JoinColumn(name = "group_id", referencedColumnName = "id", nullable = false)
@OneToOne(optional = false)
private Group groupId;
@Column(name="name")
private String name;
@Column(name="active")
private boolean active;
public EventTeams() {
}
public EventTeams(long id, Group groupId, String name, boolean active) {
this.id = id;
this.groupId = groupId;
this.name = name;
this.active = active;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Group getGroupId() {
return eventId;
}
public void setGroupId(Group eventId) {
this.eventId = eventId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
Group.java :
@Entity
@Table(name = "group")
public class Group implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name="name")
private String name;
@Column(name="type")
private int type;
@Column(name="description")
private String description;
@Column(name="active")
private boolean active;
public GroupEvent() {
}
public Group(long id, String name, int type, String description, boolean active) {
this.id = id;
this.name = name;
this.type = type;
this.description = description;
this.active = active;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Group that = (Group) o;
return id == that.id &&
type == that.type &&
active == that.active &&
Objects.equals(name, that.name) &&
Objects.equals(description, that.description);
}
@Override
public int hashCode() {
return Objects.hash(id, name, type, description, active);
}
}
My spring boot dependecy is as below.
org.springframework.boot:spring-boot-gradle-plugin:2.3.12.RELEASE
I have looked through the accepted answer in Hibernate - unable to find Entity with ID and it doesn't answer my question because i wrote optional = true instead of optional = false and also I checked by removing it from code and no effect on result.
UPDATE :
I maid some adjustments in the code by finding out the Team entity with id as 3 and then used this entity to collect the employees and then I got the result.I don't know the exact reason and why it's behaving like this.
Teams teams = new Teams();
Query query = session.createQuery("FROM Teams where active = 1 and id = :teamId");
query.setParameter("teamId", teamId);
if(query.list().size() > 0) {
teams = (Teams) query.list().get(0);
query = session.createQuery("FROM Employees where teamId.id = :teamId and active = 1");
query.setParameter("teamId", teams.getId());
employeeList = query.list();
}