Как обновить отношение Onetoone после обновленияJAVA

Программисты JAVA общаются здесь
Anonymous
Как обновить отношение Onetoone после обновления

Сообщение Anonymous »

У меня есть приложение Spring Boot (3.4.2) с Java 21, и я сталкиваюсь с проблемой с JPA:
Вот моя организация 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
< /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>
Изменить 1: < /p>
Похоже, я могу решить свою проблему, определив метод findbonconid (), как следующий (я все еще не знаю, является ли это правильным способом решения этой проблемы): < /p>
@Override
@Transactional(readOnly = true)
public Optional findByRconId(Long rconId) {
return repository.findByRconId(rconId).map(console -> {
entityManager.detach(console);
return entityManager.find(Console.class, console.getId());
});
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... ter-update

Вернуться в «JAVA»