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) |