Last active
July 14, 2025 09:37
-
-
Save mp911de/33517cdeedc4fabcc1a6b807976396db to your computer and use it in GitHub Desktop.
HiddenClassCastException
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
}); | |
}; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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