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

Java 如何在Hibernate中正确映射一对多关系?,java,hibernate,Java,Hibernate,我有两个实体,Event(实际上是电影院里的电影)和Ticket @Entity public class Event { @Id @GeneratedValue private Integer id; @OneToOne private Movie movie; @Embedded private Auditorium auditorium; private LocalDateTime startDateTime; @O

我有两个实体,
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.
我有
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;
    }
}


UPDATE2我在
assignAuditorium
方法结束后有这样一张图片,假设
@Transactional
结束工作。然后我进入了这个方法
getAll()
显示了一个
事件
,其中包含了
票证
的列表。这可能会有所帮助。

这是由一对多关联上的急切获取类型引起的。我的第一个建议是让它保持懒散:你真的不想每次你想获得一些关于某个活动的信息时都加载250张门票。我甚至可能会避开“一个女人”协会

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

select distinct e from Event e

请发布
eventService.getAll()
方法的实现。@venkat您能解释一下我应该为注释修复什么吗?我对XML Hibernate描述没有任何经验。好的。。你能看看下面的链接吗。我尝试了这种方法,看起来和你的链接一样-没有运气,我有几个相同的事件,每个票证都用图片标注,以便于澄清。看起来你是对的!非常感谢-它很有效!
@Override
@Transactional
public List<Event> getAll() {
    return eventDao.getAll();
}

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