为什么 Hibernate 尝试设置我的 id class 的实体值?

Why Hibernate tries to set and entity value of my id class?

我有这样的树表

Granma
----------------------------------------
grandmar_id VARCHAR (PK)


Mommy (One-To-One with Grandma)
----------------------------------------
grandmar_id VARHCAR (PK)


Baby (Many-To-One with Mommy)
----------------------------------------
grandmar_id VARCHAR (PK)
baby_no     BIGINT  (PK)

我为 Grandma 编写实体,Mommy 看起来像这样。

class Grandma {

    @Id String grandmaId;
}


class Mommy implements Serializable {

    @Id
    @ManyToOne
    @JoinColumn(name = "grandma_id")
    Grandma grandma;
}

我准备了 BabyBabyId 看起来像这样。

@Data
class BabyId implements Serializable {

    // Hibernate tries to set this field with an instance of Mommy
    String mommy;

    Long babyNo;
}


@Entity
@IdClass(BabyId.class)
class Baby {

    @Id
    @ManyToOne
    @JoinColumn(name = "grandma_id")
    Mommy mommy;

    @Id
    @Column(name = "baby_no")
    Long babyNo;
}

当我尝试持久化 Baby 的实例时,Hibernate 一直说..

Could not set field value [Mommy(...] value by reflection :
    [class BabyId.mommy] setter of BabyId.mommy

为什么 JPA(Hiberate) 要在我的 BabaId#mommy 字段上设置 Mommy 的实例?

我做错了什么?我该如何解决这个问题?

我不确定以下解决方案是否特定于 Hibernate。

我注释掉 @IdClass(BabyId.class) 并使 Baby class 实现 Serializable.

@Deprecated
@Data
class BabyId implements Serializable {

    // Hibernate tries to set this field with an instance of Mommy
    String mommy;

    Long babyNo;
}


@Entity
// @IdClass(BabyId.class)
class Baby implements Serializable {

    @Id
    @ManyToOne
    @JoinColumn(name = "grandma_id")
    Mommy mommy;

    @Id
    @Column(name = "baby_no")
    Long babyNo;
}

更新

根据 .

的另一个工作图像
@Data
class BabyId implements Serializable {

    String grandmaId;

    Long babyNo;
}


@Entity
// @IdClass(BabyId.class)
class Baby implements Serializable {

    @Id
    @Column(name = "grandma_id")
    private String grandmaId;

    //@Id
    @ManyToOne
    @JoinColumn(name = "grandma_id")
    Mommy mommy;

    @Id
    @Column(name = "baby_no")
    Long babyNo;
}

BabyBabyId 中的 mommy 字段与 @IdClass@ManyToOne 注释存在冲突。

一方面,@IdClass(BabyId.class) 需要字段 String mommyLong babyNo 在 class Baby 上用 @Id 注释。

另一方面,@ManyToOne Mommy mommymommy 字段声明为 MommyBaby class 的引用。

因此,需要两个 mommy 字段,一个 @Id String mommy 和一个 @ManyToOne Mommy mommy

重命名 mommy 字段之一将解决问题。