SpringData / Hibernate @ManyToOne включается автоматически, когда не следует - PullRequest
0 голосов
/ 11 мая 2018

Учитывая две сущности, такие как

@Entity
public class Thing {
  @ManyToOne
  private ThingType thingType;
  ...
}

@Entity
public class ThingType {
  private String name;
  ...
}

Из всего, что я прочитал, каскад по умолчанию должен быть ничем, поэтому, если я получу ссылку на Thing thing и изменим поле имени его ThingType, затем, используя JpaRepository<Thing, Long> вызов thingRepo.save(thing), я ожидаю, что изменение имени ThingType не будет сохранено.

Однако это не так, и изменение сохраняется.Я не уверен, почему это происходит?Что мне здесь не хватает?

Соответствующие версии:

  • org.springframework.boot: spring-boot: jar: 1.5.7.RELEASE
  • org.hibernate: hibernate-core: jar: 5.0.12.Final
  • org.springframework.data: spring-data-jpa: jar: 1.11.7.RELEASE

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Ну, каскадирование это что-то еще, позвольте мне спросить вас кое-что.Выполните следующие действия:

Thing thing = session.get(Thing .class, someId);
thing.getThingType().setTitle("new title");

и ничего более, снова вы увидите обновления гибернации thingType.

Это называется грязной проверкой, если объект подключен к активному сеансу гибернации.и его состояние сохранения изменяется, Hibernate автоматически обновляет связанную строку в базе данных.Событие без вызова сохранения или обновления.

Так что же такое каскад?Рассмотрим следующий случай:

Thing myThing = new Thing();
ThingType myThingType = new ThingType();
myThing.setThingType(myThingType);
session.save(myThing);

, если тип каскада ассоциации не установлен, тогда вы получите исключение, потому что вы ссылаетесь на временный объект thingType.Но если вы установите постоянный тип каскада, то спящий режим сначала сохраняет thingType, а затем сохраняет thing, и все идет хорошо.

Так что помните, если вы выбираете объект, то обновите его свойствав том же сеансе нет необходимости вызывать метод update или saveOrUpdate в сеансе hibernate (или jpa entityManager), поскольку он уже находится в состоянии attached и его состояние отслеживается hibernate.

0 голосов
/ 11 мая 2018

Ну, я бы ожидал того же, но похоже, что Hibernate имеет свое поведение по умолчанию.На форуме Hibernate кто-то задавал почти тот же вопрос.Ответ относится к функции «грязной проверки» Hibernate, которая обнаружит и сохранит / объединит изменение.Вы можете изменить это поведение, используя аннотацию Cascade в Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...