JPA 2.1 - Странное поведение с отношениями один к одному - PullRequest
1 голос
/ 30 мая 2019

Я испытываю странное поведение в отношениях один на один.У меня есть отношения один к одному между двумя объектами: GeographicLocation и IdentityDocument.В этих отношениях GeographicLocation является родительским объектом.Отношение принадлежит сущности IdnetityDocument.Вот реализация JPA:

@Entity
@Table(name="GEOGRAPHICAL_LOCATION")
public class GeographicalLocation implements Serializable
{
  private Long id;
  ...

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "GEOGRAPHICAL_LOCATION_ID")
  public Long getId()
  {
    return id;
  }

  public void setId(Long id)
  {
    this.id = id;
  }
  ...
}

@Entity
@Table(name="IDENTITY_DOCUMENT")
public class IdentityDocument implements Serializable
{
  private Long id;
  ...
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "IDENTITY_DOCUMENT_ID")
  public Long getId()
  {
    return id;
  }

  public void setId(Long id)
  {
    this.id = id;
  }

  @OneToOne
  @MapsId
  @JoinColumn(name = "IDENTITY_DOCUMENT_ID")
  public GeographicalLocation getPlaceOfIssue()
  {
    return placeOfIssue;
  }

  public void setPlaceOfIssue(GeographicalLocation placeOfIssue)
  {
    this.placeOfIssue = placeOfIssue;
  }

Это генерирует следующую модель базы данных:

enter image description here Теперь, пытаясь сохранить эти объекты, как это:

GeographicalLocation geographicalLocation = ...;
IdentityDocument identityDocument = ...;
geographicalLocationFacade.save(geographicalLocation);
identityDocument.setPlaceOfIssue(geographicalLocation);
identityDocumentFacade.save(identityDocument);

создает две записи в таблице GEOGRAPHICAL_LOCATION и ни одной в таблице IDENTITY_DOCUMENT.enter image description here

Похоже, что при сохранении объекта-потомка создается запись в главной таблице, а при сохранении главного объекта правильно создается запись в главной таблице, а в потомке - нет.Таблица.Я пытался играть по другому сценарию и гуглить, но до сих пор не понимаю, что здесь может произойти.Заранее большое спасибо тому, кто может затенить свет.С уважением, Николас

1 Ответ

0 голосов
/ 30 мая 2019

Это ошибка в спящем режиме, с которой я тоже столкнулся. Установлено, что @GeneratedValue(strategy = GenerationType.IDENTITY) было причиной. Если вы используете AUTO вместо IDENTITY, то это будет работать, но основная причина, по которой мы используем IDENTITY, состоит в том, чтобы запретить дополнительный запрос select с помощью hibernate для определения максимального значения id, оставляя его для БД, что будет вашим компромиссом делать.

...