我有两个实体,Event
(实际上是电影中的电影)和Ticket
。
@Entity
public class Event {
@Id
@GeneratedValue
private Integer id;
@OneToOne
private Movie movie;
@Embedded
private Auditorium auditorium;
private LocalDateTime startDateTime;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "event")
private List<Ticket> tickets = new ArrayList<>();
// getters/setters, etc.
Event
包含要出售的Ticket
个列表,每个Ticket
应指向一个Event
。
@Entity
public class Ticket {
@Id
@GeneratedValue
private Integer id;
@ManyToOne(cascade = CascadeType.ALL, targetEntity = Event.class)
private Event event;
@OneToOne
private User user;
@Embedded
private Seat seat;
private TicketState state;
private Float price;
// getters/setters, etc.
我有EventService
这样的方法(Auditorium
只包含座位数和VIP座位数),bookingDao
只保存Ticket
在DB中:
@Override
@Transactional
public boolean assignAuditorium(Integer eventId, Auditorium auditorium, LocalDateTime datetime) {
for (Event event : getAll()) {
if (auditorium.equals(event.getAuditorium()) && intersectsWithAnotherEvent(event, datetime)) {
return false;
}
}
Event currentEvent = getById(eventId);
currentEvent.setAuditorium(auditorium);
currentEvent.setStartDateTime(datetime);
List<Ticket> tickets = currentEvent.getTickets();
Integer seatsNumber = auditorium.getSeatsNumber();
List<Integer> vipSeats = auditorium.getVipSeats();
for (int i = 1; i <= seatsNumber; i++) {
Ticket ticket = new Ticket();
ticket.setEvent(currentEvent);
ticket.setState(TicketState.FREE);
ticket.setSeat(new Seat(i, vipSeats.contains(i) ? SeatStatus.VIP : SeatStatus.STANDARD));
bookingDao.create(ticket);
tickets.add(ticket);
}
return true;
}
}
问题是:创建之后,f.e。 10 Ticket
&#39; s(根据Auditorium
中的席位数量){{1}我有10个(!!!)相同的Event
&#39; s如果eventService.getAll()
列表的大小为10,则每个故障单都有Ticket
(正如预期的那样),而不是Event
。
那么,如何正确映射这些实体以获得一个事件到多个票证?谢谢!
更新 Event
getAll()
UPDATE2 我在@Override
@Transactional
public List<Event> getAll() {
return eventDao.getAll();
}
@Override
public List<Event> getAll() {
return sessionFactory.getCurrentSession().createCriteria(Event.class).list();
}
方法结束后就有这样的图片,假设,然后assignAuditorium
结束工作。我在这个方法中@Transactional
显示一个getAll()
,其Event
列表符合预期。也许它会有所帮助。
答案 0 :(得分:2)
这是由您的一对多关联中的EAGER提取类型引起的。我的第一个建议是让它保持懒惰:你真的不想每次想要获得有关事件的信息时加载250张票。我甚至可能会避开OneToMany协会。
但是,为了解决这个问题,你需要使用distinct。通过向条件查询添加DistinctRootEntity结果转换器,或者最好使用JPQL查询而不是条件查询:
select distinct e from Event e