Hibernate: отдельный запланированный повторяющийся поток, который обновляет объект, затем сохраняет его, непоследовательJAVA

Программисты JAVA общаются здесь
Anonymous
Hibernate: отдельный запланированный повторяющийся поток, который обновляет объект, затем сохраняет его, непоследователь

Сообщение Anonymous »

У меня есть сущность, скажем, собака :

Код: Выделить всё

@Entity
public class Dog {
private Long id;

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "dog_id", referecedColumnName = "id")
private Set barks;
}
< /code>
и < /p>
@Entity
public class Bark {
private Long id;
private Long time;
}
< /code>
Это однонаправленное отношение.@PostMapping("start_barks")
public void starBarks(@RequestParam(name = "dog_id") Long id) {
this.dogService.startBarks(id);
}
< /code>
и в службе: < /p>
public void startBarks(long dogId) {
Dog dog = this.dogRepository.findById(dogId);
this.barkManager.start(dog);
}
в Barkmanager :

Код: Выделить всё

@Component
public class BarkManager {
@Autowired
private DogRepository dogRepository;

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(50);

public void start(Dog dog)  {
scheduler.scheduleAtFixedRate(() -> {
executeBark(dog);
}, 10, 5, TimeUnit.SECONDS);
}

private void executeBark(Dog dog)  {
Bark bark = new Bark(System.currentTimeMillis());
dog.getBarks().add(bark);

// so that the barks are saved
Dog savedDog = this.dogRepository.save();
}
}
Таким образом, проблема, с которой я сталкиваюсь, заключается в том, что объекты Bark внутри собаки , которые используются в методе повторной executebark , все отстранены. И хотя я могу получить ссылку на прикрепленную сущность SavedDog , как бы я передал ее к следующей итерации executeBark , если он уже был запланирован на метод начала ? Кажется очень эффективным.
Какое лучшее решение для этой проблемы? Bark объекты сохраняются .
savedDog содержит устойчивые объекты Bark , которые каждый содержит идентификатор , которые я вижу в отладчике.

Код: Выделить всё

1. executeBark, dog.id = 1, dog.barks.size = 1:
new Bark(1) is added and saved in the db.

Db has:
Bark(id=1, time = 1, dog_id = 1)

2. new Bark(2) is added, dog.barks.size = 2, db now has:

Bark(id=1, time = 1, dog_id = null)
Bark(id=2, time = 1, dog_id = 1)
Bark(id=3, time = 2, dog_id = 1)

3. new Bark(3) is added, dog.barks.size = 3, db now has:

Bark(id=1, time = 1, dog_id = null)
Bark(id=2, time = 1, dog_id = null)
Bark(id=3, time = 2, dog_id = null)
Bark(id=4, time = 1, dog_id = 1)
Bark(id=5, time = 2, dog_id = 1)
Bark(id=6, time = 3, dog_id = 1)
Как можно видеть, происходит то, что каждая итерация рассматривает Dog.barks как совершенно новые объекты, которые не связаны ни с чем в базе данных. Причина этого в том, что я не знаю, как передать прикрепленную собаку сущность между запланированными вызовами, чтобы выполнить executebark .
В качестве возможного решения я вижу однонаправленный @manytoone - поэтому каждая итерация метода создаст новый код , set hat dog support to the Original Dog и Code и Code> и Code и Code и использует код/код и использует код/код

И, в контексте Hibernate, только синхронизированные двунаправленные ассоциации гарантируются должным образом в базе данных. Даже если вы наблюдаете в определенной версии Hibernate, что она работает, даже если ассоциация не синхронизирована, не гарантируется, что она будет работать, если вы обновите до более новой версии Hibernate.


Подробнее здесь: https://stackoverflow.com/questions/795 ... y-then-sav

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