You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:35:28