一对一关系,仅保留外键

时间:2018-11-09 06:11:25

标签: java hibernate jpa

我正在尝试在两个实体(PartnerDetailsJWTData之间建立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。可以使用其他任何方式吗?

1 个答案:

答案 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;