我正在尝试在两个实体(PartnerDetails
和JWTData
之间建立OneToOne关系。但是,我只想将PartnerDetails
实体的主键存储在{{1} },而不是整个对象。
JWTData
但是在使用存储库获取@Entity
@Data
@Table(name = "partner_details")
public class PartnerDetails {
@Id
@Column(name = "partner_id")
private String partnerId;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "partnerId")
private JWTData jwtData;
}
@Entity
@Data
@Table(name = "jwt_data")
@NoArgsConstructor
public class JWTData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(targetEntity = PartnerDetails.class)
@JoinColumn(name = "partner_id", foreignKey = @ForeignKey(name = "fk_jwt_partnerdetails_partnerid"))
private String partnerId;
@NotBlank
private String secret;
}
之后,Hibernate无法将String转换为JWTData
。可以使用其他任何方式吗?
答案 0 :(得分:1)
如果仅将PartnerDetails
添加到JWTData
,则JPA会知道仅使用ID。 JPA是一个面向对象的框架,因此您应该引用对象,除非您特别想要一个字段。 JPA为您处理详细信息。请注意,在此配置JWTData
中,由于拥有mappedBy
批注,因此在“拥有”实体中,因此,仅在partnerDetails
实例中设置JWTData
字段将与该关系保持不变。数据库。 jwtData
中的PartnerDetails
字段仅用于查询结果,并用于Bidirectional
而不是Unidirectional
映射。同样,由于这个原因,CascadeType
设置通常仅对拥有实体有意义,因为它是处理数据库更新和删除的实体。
在使用JPA时,请确保打开SQL输出,以便您了解实际发生的情况。
@Entity
@Data
@Table(name = "partner_details")
public class PartnerDetails {
@Id
@Column(name = "partner_id")
private String partnerId;
@OneToOne(mappedBy = "partnerDetails")
private JWTData jwtData;
@Entity
@Data
@Table(name = "jwt_data")
@NoArgsConstructor
public class JWTData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// even though it looks like the entire class it's only saving the id to the database.
@OneToOne
private PartnerDetails partnerDetails;