У меня есть сервер, использующий пружинную загрузку и данные весны 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 имеет старое значение. Даже если я выполняю сохранение только в Entity, а не в relatedEntity, 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