java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.spi.EntityEntry.getEntityKey()" because "ownerEntry" is null
Description
Activity

Andrea Boriero August 19, 2022 at 8:24 AM
Thanks ,
I managed to reproduce the issue,working on a solution!

Puhong You August 18, 2022 at 11:06 PMEdited
Hi, Andrea, I oversimplified the test case when I initially reported this bug. I apologize for my mistake. The missing piece is the Agency object. The object hierarchy is like this: each Agency can have 0 or more Users, and each User must belong to an Agency and each user can have 0 or more roles.
Here is the Agency table:
AGENCY table:
Columns:
AGENCY_ID integer not null primary key,
AGENCY_NAME varchar(256) not null,
Rows:
(100, 'Test Agency');
USER table (add the AGENCY_ID column):
Columns:
USER_ID integer not null primary key,
USER_NAME varchar(256) not null,
AGENCY_ID integer not null,
Rows:
(1, 'Ann', 100);
(2, 'Bob', 100);
Here is the Agency entity bean:
Here are the updated User entity bean:
With the addition of the Agency object, I am able to reproduce the reported java.lang.NullPointerException locally.

Andrea Boriero August 18, 2022 at 7:40 AM
Hi ,
tried also inserting directly the values in the db but still not able to reproduce the problem
Can you please share your reproducer (on github or as a zip file) so I can investigate it?
Thanks a lot

Puhong You August 17, 2022 at 11:53 PM
Hi, Andrea, thanks for looking into this. Your setup looks almost identical to mine. The only difference I can think of is that in my case I did not create the User and Role instances in the my test, so when I query for the user, the user object does not exist in session cache and Hibernate has to construct the user object from the database. Could it be that since you create the users in the test so the user objects are served from the session cache in your test?

Andrea Boriero August 17, 2022 at 9:47 PM
Hi ,
I tried to reproduce your error with the code you provided but without any success.
This is the test i created
am I missing something?
Setup:
**DataBase Tables**
1. USER table:
Columns:
USER_ID integer not null primary key,
USER_NAME varchar(256) not null,
Rows:
(1, 'Ann');
(2, 'Bob');
2. ROLE table
Columns:
ROLE_ID integer not null primary key,
ROLE_NAME varchar(256) not null,
Rows:
(1, 'Manager');
(2, 'Developer');
3. USER_ROLE table
Columns:
USER_ID integer not null,
ROLE_ID integer not null,
Composite key: (USER_ID, ROLE_ID)
Rows:
(1,1);
**EntityBeans**
4. User.java
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.Table;
import java.util.Objects;
import java.util.Set;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@Entity
@Table(name = "USER", schema = "TEST")
public class User {
private Integer userId = null;
private String userName = null;
private Set<Role> roles = null;
@Id
@Column(name = "USER_ID")
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "USER_NAME")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
@JoinTable(
name = "USER_ROLE",
schema = "TEST",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
@Fetch(FetchMode.SUBSELECT)
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
User user = (User) o;
return Objects.equals(userId, user.userId) && Objects.equals(userName,
user.userName) && Objects.equals(roles, user.roles);
}
@Override
public int hashCode() {
return Objects.hash(userId, userName, roles);
}
}
5. Role.java
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.util.Objects;
@Entity
@Table(name = "ROLE", schema = "TEST")
public class Role {
private Integer roleId = null;
private String roleName = null;
@Id
@Column(name = "ROLE_ID")
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
@Column(name = "ROLE_NAME")
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Role role = (Role) o;
return Objects.equals(roleId, role.roleId) && Objects.equals(roleName,
role.roleName);
}
@Override
public int hashCode() {
return Objects.hash(roleId, roleName);
}
}
**Query and Error**
6. This query works:
String query1 = "FROM User WHERE userId = 1";
// Obtain Hibernate session
Session session = getSession();
List<User> userList = session.createQuery(query1, User.class).list();
7. This query threw java.lang.NullPointerException:
String query2 = "FROM User WHERE userId = 2";
// Obtain Hibernate session
Session session = getSession();
List<User> userList = session.createQuery(query2, User.class).list();
The full stack traces –
Original Exception:
java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.spi.EntityEntry.getEntityKey()" because "ownerEntry" is null
at org.hibernate.loader.ast.internal.CollectionLoaderSubSelectFetch.load(CollectionLoaderSubSelectFetch.java:91)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:815)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1706)
at org.hibernate.collection.spi.AbstractPersistentCollection.lambda$initialize$3(AbstractPersistentCollection.java:609)
at org.hibernate.collection.spi.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:265)
at org.hibernate.collection.spi.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:607)
at org.hibernate.collection.spi.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:805)
at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:991)
at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:977)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:170)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:32)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:437)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:140)
at org.hibernate.loader.ast.internal.SingleIdLoadPlan.load(SingleIdLoadPlan.java:110)
at org.hibernate.loader.ast.internal.SingleIdEntityLoaderStandardImpl.load(SingleIdEntityLoaderStandardImpl.java:72)
at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4313)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4303)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:598)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:571)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:223)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:362)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:112)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:118)
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1237)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1090)
at org.hibernate.sql.results.graph.entity.internal.EntitySelectFetchInitializer.initializeInstance(EntitySelectFetchInitializer.java:197)
at org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:153)
at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:98)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:143)
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:32)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:437)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:166)
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:91)
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:102)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:305)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:246)
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:537)
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:363)
at org.hibernate.query.sqm.internal.QuerySqmImpl.list(QuerySqmImpl.java:987)