Код: Выделить всё
@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);
}
Код: Выделить всё
@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 объекты сохраняются .
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)
В качестве возможного решения я вижу однонаправленный @manytoone - поэтому каждая итерация метода создаст новый код , set hat dog support to the Original Dog и Code и Code> и Code и Code и использует код/код и использует код/код
И, в контексте Hibernate, только синхронизированные двунаправленные ассоциации гарантируются должным образом в базе данных. Даже если вы наблюдаете в определенной версии Hibernate, что она работает, даже если ассоциация не синхронизирована, не гарантируется, что она будет работать, если вы обновите до более новой версии Hibernate.
Подробнее здесь: https://stackoverflow.com/questions/795 ... y-then-sav