Code: Select all
@Entity
public class Dog {
private Long id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "dog_id", referecedColumnName = "id")
private Set barks;
}
< /code>
und < /p>
@Entity
public class Bark {
private Long id;
private Long time;
}
< /code>
Es ist eine unidirektionale Beziehung.@PostMapping("start_barks")
public void starBarks(@RequestParam(name = "dog_id") Long id) {
this.dogService.startBarks(id);
}
< /code>
und im Dienst: < /p>
public void startBarks(long dogId) {
Dog dog = this.dogRepository.findById(dogId);
this.barkManager.start(dog);
}
Code: Select all
@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();
}
}
Was wäre die bessere Lösung für dieses Problem? Die Rinde Objekte werden bestehen .
Code: Select all
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)
und im Kontext von Hibernate werden nur synchronisierte bidirektionale Assoziationen in der Datenbank garantiert ordnungsgemäß bestehen. Auch wenn Sie eine bestimmte Hibernate -Version beobachten, die es auch dann funktioniert, wenn der Verband nicht synchron ist, ist es nicht garantiert, dass es funktioniert, wenn Sie auf eine neuere Version von Hibernate ein Upgrade upgraden.