【问题标题】:OneToOne relationship, keep only foreign keyOneToOne 关系,只保留外键
【发布时间】:2018-11-09 06:11:25
【问题描述】:

我正在尝试在两个实体(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 无法将字符串转换为PartnerDetails。这可以用其他方式完成吗?

【问题讨论】:

  • 请添加表架构
  • 你需要在JWTData类中有PartnerDetails对象才能得到它

标签: java hibernate jpa


【解决方案1】:

如果您只是将PartnerDetails 添加到JWTData,那么 JPA 将知道只使用 id。 JPA 是一个面向对象的框架,因此您应该引用对象,除非您特别想要一个字段。 JPA 为您处理详细信息。请注意,在此配置中,“拥有”实体中的JWTData 由于mappedBy 注释,因此仅在JWTData 实例中设置partnerDetails 字段将保持与数据库的关系。 PartnerDetails 中的 jwtData 字段仅用于查询结果,并生成 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;

【讨论】:

  • 感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多