У меня есть две сущности, подобные следующим:
@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;
}
Проблема в том, что отношение mappedBy ведет себя по-разному в разных обстоятельствах. Вот пример
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();
Код выше показывает, что если сущность уже загружена в кэш менеджера сущностей, метод получения для отношения mappedBy может возвращать недопустимые результаты.
У меня есть доказательство, что это не работает и под JBoss. Следующий код ведет себя по-разному в зависимости от того, какой диспетчер сущностей используется. Результат непредсказуем.
Trip trip = em.find(Trip.class, tripId);
if (trip.getJobs().size() == 0) ...
Означает ли это, что mappedBy автоматически делает приложение глючным, как только оно вводится и используется?
P.S. Я не пытаюсь злоупотреблять спящим режимом. Я только хочу узнать, сталкивался ли кто-то с такой проблемой и как с ней справился