J'ai deux entités comme les suivantes:Shound J'évite d'utiliser mappedBy pour garder mon application stable?
@Entity
public class Trip {
@OneToMany(mappedBy = "trip", fetch = FetchType.LAZY)
private Set<Job> jobs = new HashSet<Job>();
}
@Entity
public class Job {
@ManyToOne(fetch = FetchType.LAZY)
private Trip trip;
}
Le problème est que la relation mappedBy se comporte différemment dans des circonstances différentes. Voici un exemple
EntityManager em1 = unit.createEntityManager();
EntityManager em2 = unit.createEntityManager();
// One EM starts transaction and stores a trip
em1.getTransaction().begin();
Trip trip = new Trip();
em1.persist(trip);
Long tripId = trip.getId();
assertThat(tripId).isPositive();
em1.getTransaction().commit();
// Then em2 starts different transaction
em2.getTransaction().begin();
// Looking up for the trip through clean em (cache is empty)
Trip em2Trip = em2.find(Trip.class, tripId);
Job job = new Job();
job.setTrip(em2Trip);
em2.persist(job);
// The em2Trip should not be updated
assertThat(em2Trip.getJobs()).hasSize(1);
em2.getTransaction().commit();
em1.getTransaction().begin();
Trip em1Trip = em1.find(Trip.class, tripId);
// fails here
assertThat(em1Trip.getJobs()).hasSize(1);
em1.getTransaction().commit();
Le code ci-dessus montre que si une entité est déjà chargée dans le cache du gestionnaire d'entités, le getter de la relation mappedBy peut retourner des résultats incorrects.
J'ai une preuve que cela ne fonctionne pas non plus sous JBoss. Le code suivant se comporte différemment selon le gestionnaire d'entité utilisé. Le résultat est imprévisible. Est-ce que cela signifie que le mappedBy rend automatiquement l'application buggée dès qu'elle est introduite et utilisée?
P.S. Je n'essaie pas d'abuser d'Hibernate. Je veux seulement savoir si quelqu'un a fait face à un tel problème et comment y ont-ils fait face
S'il vous plaît modifier votre question et essayer de garder son objectif. Personne n'aime lire les diatribes. –
Est-ce mieux maintenant? – artemb