private void addEmailToPerson(Long personId, String emailAddress) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    Person aPerson = (Person) session.load(Person.class, personId);

    // The getEmailAddresses() might trigger a lazy load of the collection
    aPerson.getEmailAddresses().add(emailAddress);

    session.getTransaction().commit();
  }
  private void addPersonToEvent(Long personId, Long eventId) {

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    Person aPerson =
        (Person)
            session
                .createQuery("select p from Person p left join fetch p.events where p.id = :pid")
                .setParameter("pid", personId)
                .uniqueResult(); // Eager fetch the collection so we can use it detached

    Event anEvent = (Event) session.load(Event.class, eventId);
    // If we want to handle it bidirectional and detached, we also need to load this
    // collection with an eager outer-join fetch, this time with Criteria and not HQL:
    /*
    Event anEvent = (Event) session
            .createCriteria(Event.class).setFetchMode("participants", FetchMode.JOIN)
            .add( Expression.eq("id", eventId) )
            .uniqueResult(); // Eager fetch the colleciton so we can use it detached
    */

    session.getTransaction().commit();

    // End of first unit of work

    aPerson.getEvents().add(anEvent); // aPerson is detached
    // or bidirectional safety method, setting both sides: aPerson.addToEvent(anEvent);

    // Begin second unit of work

    Session session2 = HibernateUtil.getSessionFactory().getCurrentSession();
    session2.beginTransaction();

    session2.update(aPerson); // Reattachment of aPerson

    session2.getTransaction().commit();
  }