Отношения OneToOne, сохраняйте только внешний ключ - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь установить связь 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 не может преобразовать строку в PartnerDetails. Можно ли это сделать любым другим способом?

1 Ответ

0 голосов
/ 09 ноября 2018

Если вы просто добавите PartnerDetails к JWTData, то JPA будет знать, что нужно использовать только идентификатор. 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...