Spring JPA @IdClass报错:实体中未找到对应属性问题
问题解决:Hibernate @IdClass 属性匹配错误
错误信息:
Caused by: org.hibernate.AnnotationException: Property of @IdClass not found in entity com.susanghan.spotrightspring.photo.domain.MemberSpotPhoto: SpotPhotoId at org.hibernate.cfg.AnnotationBinder.fillComponent(AnnotationBinder.java:2793) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.cfg.AnnotationBinder.bindIdClass(AnnotationBinder.java:2919) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.cfg.AnnotationBinder.mapAsIdClass(AnnotationBinder.java:1052) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:778) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:225) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:239) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:282) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.7.Final.jar:5.6.7.Final]
涉及类代码
MemberSpotPhotoPK 类
@Getter @NoArgsConstructor @AllArgsConstructor public class MemberSpotPhotoPK implements Serializable { private static final Long serialVersionUID = 1L; private Long memberSpotId; private Long SpotPhotoId; }
MemberSpotPhoto 实体类
@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @IdClass(MemberSpotPhotoPK.class) public class MemberSpotPhoto extends BaseTimeEntity { @Id @Column(insertable = false, updatable = false) private Long memberSpotId; @Id @Column(insertable = false, updatable = false) private Long spotPhotoId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_spot_id", referencedColumnName = "member_spot_id", insertable = false, updatable = false) private MemberSpot memberSpot; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "spot_photo_id", referencedColumnName = "spot_photo_id", insertable = false, updatable = false) private SpotPhoto spotPhoto; private Byte order; @Builder public MemberSpotPhoto(Long memberSpotId, Long spotPhotoId, Byte order) { this.memberSpotId = memberSpotId; this.spotPhotoId = spotPhotoId; this.order = order; } }
MemberSpot 实体类
@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class MemberSpot extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_spot_id") private Long id; .... }
SpotPhoto 实体类
@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class SpotPhoto extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "spot_photo_id") private Long id; .... }
问题原因及修复
问题根源是属性名称大小写不匹配:
MemberSpotPhotoPK类中的属性名为SpotPhotoId(首字母大写)MemberSpotPhoto实体中的对应属性名为spotPhotoId(首字母小写)
Hibernate 使用 @IdClass 时,要求主键类的属性名与实体类中的主键属性名完全一致(包括大小写),否则无法完成属性映射,抛出上述异常。
修复方法:修改 MemberSpotPhotoPK 类中的属性名,使其与实体类保持一致,将 SpotPhotoId 改为 spotPhotoId:
@Getter @NoArgsConstructor @AllArgsConstructor public class MemberSpotPhotoPK implements Serializable { private static final Long serialVersionUID = 1L; private Long memberSpotId; // 修正属性名大小写 private Long spotPhotoId; }
内容的提问来源于stack exchange,提问作者gs97ahn
相关产品推荐
相关产品推荐

