Hibernate JPA UniDirectional OneToOne Join - обновление нулевого внешнего ключа после того, как он был вставлен как нулевой - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь реализовать следующий сценарий, используя однонаправленное сопоставление OneToOne с использованием JPA Hibernate в веб-приложении Spring-Boot:

  1. Используйте CrudRepository.save () для вставки записи в объект (EntityTwo) с внешним ключом другого объекта (EntityOne) как null
  2. Обновите вставленную запись, чтобы установить для внешнего ключа ненулевое значение, используя CrudRepository.save ()

Первая сущность выглядит так:

@Entity
public class EntityOne implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "entity_one_id", updatable = false, nullable = false)
    private Long id;

}

Вторая сущность выглядит так:

@Entity
public class EntityTwo implements Serializable {

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "entity_one_id")
    private EntityOne entityOne;
}

Так вот как выглядят вызовы сохранения

Первый вызов сохранения:

EntityTwo entityTwo = new EntityTwo();
entityTwoRepository.save(entityTwo);

Второй вызов сохранения:

EntityOne entityOne = entityOneRepository.getByEntityOneId(1); // this results in a not-null value
EntityTwo entityTwo = new EntityTwo();
entityTwo.setEntityOne(entityOne);
entityTwoRepository.save(entityTwo);

После второго вызова мой надеюсь, что внешний ключ будет установлен в EntityTwo, но это не так. Пожалуйста, дайте мне знать, если я делаю что-то совершенно не так или есть лучший / другой способ добиться этого с помощью Spring-Boot JPA

1 Ответ

0 голосов
/ 22 июня 2020

Вы должны каскадировать операции.

@Entity
public class EntityOne implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "entity_one_id", updatable = false, nullable = false)
    private Long id;

}

@Entity
public class EntityTwo implements Serializable {

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "entity_one_id")
    private EntityOne entityOne;
}

Попробуйте;

EntityOne entityOne = new EntityOne();
EntityTwp entityTwo = new EntityTwo();
entityTow.setEntityOne(entityOne);
entityTwoRepository.save(entityTwo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...