Hibernate: Ein separater geplanter wiederholter Thread, der das Entität aktualisiert und dann es speichert, Daten inkonsJava

Java-Forum
Anonymous
 Hibernate: Ein separater geplanter wiederholter Thread, der das Entität aktualisiert und dann es speichert, Daten inkons

Post by Anonymous »

Ich habe eine Entität, sagen wir, Hund :

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);
}
Im BarkManager :

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();
}
}
Das Problem, auf das ich begegnet bin, ist also, dass die Rinde Objekte im Hund , der in der wiederholten ExecuteBark -Methode verwendet wird, alle abgelöst werden. Und während ich den Hinweis auf die beigefügte Entität gespeichert habe, wie würde ich sie dann an die nächste Iteration der ExecuteBark übergeben, wenn sie bereits von der Start Methode geplant wurde? Scheinen sehr effizient.
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)
Wie zu sehen ist, ist, dass jede Iteration Dog behandelt. Der Grund dafür ist, dass ich nicht weiß, wie ich den angehängten Hund zwischen geplanten Aufrufen zum ExecuteBark . Es. Da es keinen festgelegten zwischen Methodenaufrufen gibt, sollte es gut funktionieren. Beziehung: < /p>

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post