我正在尝试在两个实体(PartnerDetailsJWTData)之间建立一个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;

07-28 00:42