OneToOne, сохраняйте только внешний ключ

Я пытаюсь установить отношения OneToOne между двумя объектами ( PartnerDetails и JWTData . Как бы то ни было, я хочу хранить первичный ключ объекта 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 . Можно ли это сделать любым другим способом?

Всего 1 ответ


Если вы просто добавите PartnerDetails в JWTData тогда JPA будет знать, что использовать только идентификатор. JPA - это объектно-ориентированная структура, поэтому вы должны ссылаться на объекты, если вы специально не хотите поля. JPA обрабатывает детали для вас. Обратите внимание, что в этой конфигурации JWTData в «владеющей» сущности из-за аннотации mappedBy , поэтому только установка поля JWTData экземпляре JWTData будет сохранять связь с базой данных. Поле jwtData в PartnerDetails предназначено только для результатов запроса и используется для Unidirectional преобразования вместо 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;

Есть идеи?

10000