[JIRA] (HHH-15453) java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.spi.EntityEntry.getEntityKey()" because "ownerEntry" is null
by Puhong You (JIRA)
Puhong You ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%... ) *created* an issue
Hibernate ORM ( https://hibernate.atlassian.net/browse/HHH?atlOrigin=eyJpIjoiYTQ5NzY0YzVk... ) / Bug ( https://hibernate.atlassian.net/browse/HHH-15453?atlOrigin=eyJpIjoiYTQ5Nz... ) HHH-15453 ( https://hibernate.atlassian.net/browse/HHH-15453?atlOrigin=eyJpIjoiYTQ5Nz... ) java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.spi.EntityEntry.getEntityKey()" because "ownerEntry" is null ( https://hibernate.atlassian.net/browse/HHH-15453?atlOrigin=eyJpIjoiYTQ5Nz... )
Issue Type: Bug Affects Versions: 6.1.2 Assignee: Unassigned Components: hibernate-core Created: 16/Aug/2022 11:54 AM Environment: Hibernate 6.1.2.Final, Java 17 and 18, MacOS/Windows, DB2 Priority: Major Reporter: Puhong You ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%... )
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)
( https://hibernate.atlassian.net/browse/HHH-15453#add-comment?atlOrigin=ey... ) Add Comment ( https://hibernate.atlassian.net/browse/HHH-15453#add-comment?atlOrigin=ey... )
Get Jira notifications on your phone! Download the Jira Cloud app for Android ( https://play.google.com/store/apps/details?id=com.atlassian.android.jira.... ) or iOS ( https://itunes.apple.com/app/apple-store/id1006972087?pt=696495&ct=EmailN... ) This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#100204- sha1:f005d5a )
3 years, 1 month