我正在尝试在两个实体(PartnerDetails
和JWTData
)之间建立一个OneToOne关系。但是,我只想将PartnerDetails
实体的主键存储在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;
}
但是在使用存储库获取
JWTData
之后,Hibernate无法将String转换为PartnerDetails
。可以使用其他任何方式完成此操作吗? 最佳答案
如果仅将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;