На случай, если это может быть полезно, вот мое приложение. Прозрачные Конфигурация:
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/mydatabase
spring.datasource.username=****
spring.datasource.password=****
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.show-sql=false
spring.jpa.open-in-view=false
spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Вот моя организация rcon :
@Entity
@Table(name = "rcon", uniqueConstraints = @UniqueConstraint(columnNames = { "rcon_host", "rcon_port" }))
public class Rcon{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition = PostgreSqlColumn.POSTGRESQL_BIGINT, nullable = false)
private Long id;
@Column(name = "name", columnDefinition = PostgreSqlColumn.POSTGRESQL_VARCHAR_255, nullable = false, unique = true)
private String name;
// Some other fields, nothing special
}
Для каждого rcon консоль может быть создан с помощью FK для rcon :
@Entity
@Table(name = "console")
public class Console {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", columnDefinition = PostgreSqlColumn.POSTGRESQL_BIGINT, nullable = false)
private Long id;
@OneToOne(optional = false, fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REFRESH}, orphanRemoval = false)
@JoinColumn(name = "rcon_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private Rcon rcon;
// Some other fields, nothing special
}
Проблема, с которой я сталкиваюсь, возникает в следующей ситуации:
- Я сохраняю новый rcon Использование метода ниже: ok
Где -то в приложении у меня есть слушатель этого rconevent. Когда слушатель потребляет событие, он попытается получить консоли из базы данных. На этом этапе я ожидаю, что console.getrcon (). GetName () будет равным «bar», но это все еще равно «foo» (Entity RCon перед обновлением на шаге 3). Это проблема, которую я хотел бы решить: < /li>
< /ol>
@EventListener
protected void onRconEvent(RconEvent event) {
var rcon = event.getRcon();
if(event.isUpdated()) {
consoleService.findByRconId(rcon.getId()).ifPresent(console -> {
logger.error("console = {}", console); // Here, is expect console.getRcon.getName() to be 'bar', but is still 'foo'
this.link(console);
});
}
}
< /code>
Я много прочитал о освежении менеджера объектов и попытался добавить его в метод Findbonconid (см. Код ниже), а также о использовании cascadetype.refresh в моем аннотации @onetoone или замену «save ()» на «SaveAndflush» для предприятия RCon. Тем не менее, ни одна из моих попыток не сработала до сих пор, и ссылка на RCON, которую я получаю в консоли, все еще старая. Что я делаю не так? Спасибо!@Override
@Transactional(readOnly = true)
public Optional findByRconId(Long rconId) {
return repository.findByRconId(rconId).map(console -> {
if (entityManager.contains(console)) {
entityManager.refresh(console);
}
return console;
});
}
< /code>
Редактировать: < /p>
Похоже, я могу улучшить ситуацию, определив метод findbonconid (), как следующее (в данном случае, объект почти всегда обновляется, но я думаю, что я получил случай, когда он не был ..): < /p>
: < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ter-update