What do you think about this aggregator (DDD) for booking and cancelling tickets? Is it ok, or would you do it differently somehow?
@Entity @Table(name = "screenings") @Getter @ToString(exclude = "tickets") public class Screening { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private LocalDateTime date; private Long filmId; private Long hallId; @OneToMany(cascade = CascadeType.PERSIST) @JoinColumn(name = "screening_id) private List<Ticket> tickets; protected Screening() {} public Screening(LocalDateTime date, Long filmId, Long hallId) { this.date = date; this.filmId = filmId; this.hallId = hallId; this.tickets = new ArrayList<>(); } public void bookTickets(List<Ticket> tickets, TicketBookingPolicy ticketBookingPolicy) { ticketBookingPolicy.checkScreeningDate(this.date); tickets.forEach(ticket -> { if (this.tickets.contains(ticket)) { throw new TicketAlreadyExistsException(); } }); this.tickets.addAll(tickets); } public Ticket cancelTicket(Long ticketId, TicketCancellingPolicy ticketCancellingPolicy) { ticketCancellingPolicy.checkScreeningDate(this.date); var foundTicket = tickets .stream() .filter(ticket -> ticket.getId().equals(ticketId)) .findFirst() .orElseThrow(TicketNotFoundException::new); foundTicket.cancel(); return foundTicket; } }