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