Вот моя организация 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
< /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. However, none of my attempts have worked so far, and the Rcon reference I get in the Console is still the old one. Что я делаю не так? Спасибо!@Override
@Transactional(readOnly = true)
public Optional findByRconId(Long rconId) {
return repository.findByRconId(rconId).map(console -> {
if (entityManager.contains(console)) {
entityManager.refresh(console);
}
return console;
});
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... ter-update