У меня есть сервер, использующий весеннюю загрузку и весенние данные jpa.
У меня есть два класса с аннотацией @RestController
на моем сервере. Один из них может изменить сущности, а другой нет.
@RestController
@Slf4j
public class ControllerA {
private EntityRepository entityRepository;
public ControllerA(EntityRepository entityRepository) {
this.entityRepository = entityRepository;
}
@PostMapping("/pathStr")
public void changeEntity(@RequestParam("entityId") Long entityId) {
// init
Entity entity = entityRepository.findById(entityId);
// make changes to entity
entity.getOneToOneLinkedEntity().setIntProperty(0);
// save entity
entityRepository.save(entity);
}
}
@RestController
@Slf4j
public class ControllerB {
private Entity cachedEntity;
private EntityRepository entityRepository;
public ControllerB(EntityRepository entityRepository) {
this.entityRepository = entityRepository;
}
@MessageMapping("/otherPath")
public void getEntity(ArgumentType argument) {
if (cachedEntity == null) {
cachedEntity = entityRepository.save(new Entity());
}
Entity entity = entityRepository.findById(cachedEntity.getId()).orElse(null);
int properyValue = entity.getOneToOneLinkedEntity().getIntProperty(); // this is not zero
}
}
Вот две сущности и репозиторий:
@Entity
public class Entity implements Serializable {
@Id
@GeneratedValue private Long id;
@NotNull
@OneToOne(cascade=CascadeType.ALL)
private OneToOneLinkedEntity linkedEntity;
}
@Entity
public class OneToOneLinkedEntity implements Serializable {
@Id
@GeneratedValue private Long id;
@NotNull
private int intProperty = 0;
}
public interface EntityRepository extends JpaRepository<Entity, Long> {
}
Я вызываю ControllerA.changeEntity из клиента, и как только он возвращается, я делаю еще один вызов ControllerB.getEntity. Изменения, которые я сделал в первом вызове, не отображаются во втором вызове (и их также нет в базе данных, если я делаю запрос непосредственно с помощью sql), свойство int имеет старое значение. Несмотря на то, что я сохраняю только объект, а не связанный объект, CascadeType.ALL
также должен обновлять связанный объект, верно?
Я попытался добавить entityRepository.flush()
после сохранения в ControllerA, но проблема все еще появляется. Что я могу сделать? Как я могу заставить ControllerB получить правильное значение intProperty?
Это то, что у меня есть в application.properties:
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/db_name
spring.datasource.username=user
spring.datasource.password=pass
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultComponentSafeNamingStrategy