为什么 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;
}
我准备了 Baby
和 BabyId
看起来像这样。
@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;
}
Baby
和 BabyId
中的 mommy
字段与 @IdClass
和 @ManyToOne
注释存在冲突。
一方面,@IdClass(BabyId.class)
需要字段 String mommy
和 Long babyNo
在 class Baby
上用 @Id
注释。
另一方面,@ManyToOne Mommy mommy
将 mommy
字段声明为 Mommy
对 Baby
class 的引用。
因此,需要两个 mommy
字段,一个 @Id String mommy
和一个 @ManyToOne Mommy mommy
。
重命名 mommy
字段之一将解决问题。
我有这样的树表
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;
}
我准备了 Baby
和 BabyId
看起来像这样。
@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;
}
Baby
和 BabyId
中的 mommy
字段与 @IdClass
和 @ManyToOne
注释存在冲突。
一方面,@IdClass(BabyId.class)
需要字段 String mommy
和 Long babyNo
在 class Baby
上用 @Id
注释。
另一方面,@ManyToOne Mommy mommy
将 mommy
字段声明为 Mommy
对 Baby
class 的引用。
因此,需要两个 mommy
字段,一个 @Id String mommy
和一个 @ManyToOne Mommy mommy
。
重命名 mommy
字段之一将解决问题。