Skip to content

Instantly share code, notes, and snippets.

@mp911de
Last active July 14, 2025 09:37
Show Gist options
  • Save mp911de/33517cdeedc4fabcc1a6b807976396db to your computer and use it in GitHub Desktop.
Save mp911de/33517cdeedc4fabcc1a6b807976396db to your computer and use it in GitHub Desktop.
HiddenClassCastException
package com.example.demo;
import jakarta.persistence.EntityManager;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.support.TransactionTemplate;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
CommandLineRunner commandLineRunner(EntityManager em, TransactionTemplate tt) {
return args -> {
tt.executeWithoutResult(it -> {
IdClassExampleDepartment dep1 = new IdClassExampleDepartment();
dep1.setDepartmentId(1L);
dep1.setName("Dep1");
IdClassExampleEmployee emp1 = new IdClassExampleEmployee();
emp1.setEmpId(1L);
emp1.setDepartment(dep1);
em.persist(emp1);
ReferencingIdClassExampleEmployee refEmp1 = new ReferencingIdClassExampleEmployee();
refEmp1.setId(1L);
refEmp1.setEmployee(emp1);
em.persist(refEmp1);
em.createQuery(
"SELECT r FROM ReferencingIdClassExampleEmployee r LEFT JOIN r.employee e WHERE e.empId = :employeeId")
.setParameter("employeeId", 1L).getResultList();
});
};
}
}
package com.example.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class EmbeddedIdExampleDepartment {
private String name;
@Id private Long departmentId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getDepartmentId() {
return departmentId;
}
public void setDepartmentId(Long departmentId) {
this.departmentId = departmentId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (departmentId ^ (departmentId >>> 32));
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EmbeddedIdExampleDepartment other = (EmbeddedIdExampleDepartment) obj;
if (departmentId != other.departmentId)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package com.example.demo;
import jakarta.persistence.CascadeType;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.MapsId;
import org.yaml.snakeyaml.error.Mark;
@Entity
public class EmbeddedIdExampleEmployee {
@EmbeddedId private EmbeddedIdExampleEmployeePK employeePk;
@MapsId("departmentId")//
@ManyToOne(cascade = CascadeType.ALL) private//
EmbeddedIdExampleDepartment department;
private String name;
public EmbeddedIdExampleEmployeePK getEmployeePk() {
return employeePk;
}
public void setEmployeePk(EmbeddedIdExampleEmployeePK employeePk) {
this.employeePk = employeePk;
}
public EmbeddedIdExampleDepartment getDepartment() {
return department;
}
public void setDepartment(EmbeddedIdExampleDepartment department) {
this.department = department;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.example.demo;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import java.io.Serial;
import java.io.Serializable;
@Embeddable
public class EmbeddedIdExampleEmployeePK implements Serializable {
@Serial private static final long serialVersionUID = 1L;
@Column(nullable = false) private Long employeeId;
@Column(nullable = false) private Long departmentId;
public EmbeddedIdExampleEmployeePK() {}
public EmbeddedIdExampleEmployeePK(Long employeeId, Long departmentId) {
this.employeeId = employeeId;
this.departmentId = departmentId;
}
public Long getEmployeeId() {
return this.employeeId;
}
public void setEmployeeId(Long employeeId) {
this.employeeId = employeeId;
}
public Long getDepartmentId() {
return this.departmentId;
}
public void setDepartmentId(Long departmentId) {
this.departmentId = departmentId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (departmentId ^ (departmentId >>> 32));
result = prime * result + (int) (employeeId ^ (employeeId >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EmbeddedIdExampleEmployeePK other = (EmbeddedIdExampleEmployeePK) obj;
if (departmentId != other.departmentId)
return false;
if (employeeId != other.employeeId)
return false;
return true;
}
}
org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private com.example.demo.IdClassExampleDepartment com.example.demo.IdClassExampleEmployee.department] by reflection for persistent property [com.example.demo.IdClassExampleEmployee#department] : com.example.demo.IdClassExampleEmployeePK@3e1
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:55) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.metamodel.mapping.internal.AbstractEmbeddableMapping.getValue(AbstractEmbeddableMapping.java:113) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.embeddable.internal.NonAggregatedIdentifierMappingInitializer.resolveInstanceSubInitializers(NonAggregatedIdentifierMappingInitializer.java:327) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.embeddable.internal.NonAggregatedIdentifierMappingInitializer.resolveInstance(NonAggregatedIdentifierMappingInitializer.java:314) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.embeddable.internal.NonAggregatedIdentifierMappingInitializer.resolveInstance(NonAggregatedIdentifierMappingInitializer.java:48) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.Initializer.resolveInstance(Initializer.java:149) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.entity.internal.EntitySelectFetchInitializer.resolveInstance(EntitySelectFetchInitializer.java:188) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.entity.internal.EntitySelectFetchInitializer.resolveInstance(EntitySelectFetchInitializer.java:44) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.Initializer.resolveInstance(Initializer.java:149) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.entity.internal.EntityInitializerImpl.resolveInstanceSubInitializers(EntityInitializerImpl.java:666) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.entity.internal.EntityInitializerImpl.resolveKey(EntityInitializerImpl.java:593) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.entity.internal.EntityInitializerImpl.resolveKey(EntityInitializerImpl.java:457) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.graph.entity.internal.EntityInitializerImpl.resolveKey(EntityInitializerImpl.java:97) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:235) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:141) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.spi.ListResultsConsumer.read(ListResultsConsumer.java:249) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:201) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:35) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:224) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:102) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.executeQuery(JdbcSelectExecutor.java:91) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:165) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$1(ConcreteSqmSelectQueryPlan.java:152) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:442) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:362) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:380) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:143) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at org.hibernate.query.Query.getResultList(Query.java:120) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
at com.example.demo.DemoApplication.lambda$commandLineRunner$0(DemoApplication.java:41) ~[classes/:na]
at org.springframework.transaction.support.TransactionOperations.lambda$executeWithoutResult$0(TransactionOperations.java:68) ~[spring-tx-6.2.8.jar:6.2.8]
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-6.2.8.jar:6.2.8]
at org.springframework.transaction.support.TransactionOperations.executeWithoutResult(TransactionOperations.java:67) ~[spring-tx-6.2.8.jar:6.2.8]
at com.example.demo.DemoApplication.lambda$commandLineRunner$1(DemoApplication.java:23) ~[classes/:na]
at org.springframework.boot.SpringApplication.lambda$callRunner$5(SpringApplication.java:788) ~[spring-boot-3.5.3.jar:3.5.3]
at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:82) ~[spring-core-6.2.8.jar:6.2.8]
at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60) ~[spring-core-6.2.8.jar:6.2.8]
at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:86) ~[spring-core-6.2.8.jar:6.2.8]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:796) ~[spring-boot-3.5.3.jar:3.5.3]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:787) ~[spring-boot-3.5.3.jar:3.5.3]
at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:772) ~[spring-boot-3.5.3.jar:3.5.3]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:772) ~[spring-boot-3.5.3.jar:3.5.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:325) ~[spring-boot-3.5.3.jar:3.5.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.5.3.jar:3.5.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.5.3.jar:3.5.3]
at com.example.demo.DemoApplication.main(DemoApplication.java:15) ~[classes/:na]
Caused by: java.lang.IllegalArgumentException: Can not set com.example.demo.IdClassExampleDepartment field com.example.demo.IdClassExampleEmployee.department to com.example.demo.IdClassExampleEmployeePK
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:na]
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:na]
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) ~[na:na]
at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) ~[na:na]
at java.base/java.lang.reflect.Field.get(Field.java:425) ~[na:na]
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:51) ~[hibernate-core-6.6.18.Final.jar:6.6.18.Final]
... 52 common frames omitted
package com.example.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class IdClassExampleDepartment {
private String name;
@Id private long departmentId;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getDepartmentId() {
return departmentId;
}
public void setDepartmentId(long departmentId) {
this.departmentId = departmentId;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (departmentId ^ (departmentId >>> 32));
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
IdClassExampleDepartment other = (IdClassExampleDepartment) obj;
if (departmentId != other.departmentId)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package com.example.demo;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
import jakarta.persistence.ManyToOne;
import org.yaml.snakeyaml.error.Mark;
@IdClass(IdClassExampleEmployeePK.class)
@Entity
public class IdClassExampleEmployee {
@Id private long empId;
@Id @ManyToOne(cascade = CascadeType.ALL) private IdClassExampleDepartment department;
private String name;
public long getEmpId() {
return empId;
}
public void setEmpId(long empId) {
this.empId = empId;
}
public IdClassExampleDepartment getDepartment() {
return department;
}
public void setDepartment(IdClassExampleDepartment department) {
this.department = department;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.example.demo;
import java.io.Serial;
import java.io.Serializable;
public class IdClassExampleEmployeePK implements Serializable {
@Serial private static final long serialVersionUID = 1L;
private long empId;
private long department;
public IdClassExampleEmployeePK() {}
public IdClassExampleEmployeePK(long empId, long department) {
this.empId = empId;
this.department = department;
}
public long getEmpId() {
return this.empId;
}
public void setEmpId(long empId) {
this.empId = empId;
}
public long getDepartment() {
return this.department;
}
public void setDepartment(long department) {
this.department = department;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (department ^ (department >>> 32));
result = prime * result + (int) (empId ^ (empId >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
IdClassExampleEmployeePK other = (IdClassExampleEmployeePK) obj;
if (department != other.department) {
return false;
}
if (empId != other.empId) {
return false;
}
return true;
}
}
package com.example.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
@Entity
public class ReferencingIdClassExampleEmployee {
@Id private long id;
@ManyToOne public IdClassExampleEmployee employee;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public IdClassExampleEmployee getEmployee() {
return employee;
}
public void setEmployee(IdClassExampleEmployee employee) {
this.employee = employee;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment