gpt4 book ai didi

java - 如何在 Hibernate 中正确映射一对多关系?

转载 作者:行者123 更新时间:2023-11-30 03:02:41 25 4
gpt4 key购买 nike

我有两个实体,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 只需保存 数据库中的票:

@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 张门票(根据礼堂的座位数量)我有 10 个(!!!)相同的 Activity ,因为eventService.getAll() 包含大小为 10 的 Ticket 列表,每张票证都有适当的 Event (如预期),而不是一个 事件

那么,如何正确映射这些实体以获得单事件对多门票?谢谢!

更新getAll()的实现

@Override
@Transactional
public List<Event> getAll() {
return eventDao.getAll();
}

@Override
public List<Event> getAll() {
return sessionFactory.getCurrentSession().createCriteria(Event.class).list();
}

enter image description here

UPDATE2 我在 assignAuditorium 方法结束后有这样的图片,假设,然后 @Transactional 结束工作。比我在这个方法中 getAll() 显示一个 Event 以及预期的 Ticket 列表。也许会有帮助。

最佳答案

这是由一对多关联上的 EAGER 获取类型引起的。我的第一个建议是让它变得懒惰:您真的不想每次想要获取有关 Activity 的一些信息时都加载 250 张门票。我什至可能会避免 OneToMany 关联。

但是,为了解决这个问题,您需要使用distinct。通过将 DistinctRootEntity 结果转换器添加到您的条件查询中,或者最好使用 JPQL 查询而不是条件查询:

select distinct e from Event e

关于java - 如何在 Hibernate 中正确映射一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com