Problema con hibernate

Hola compañeros, estoy desarrollando un proyecto con JSF y hibernate, aunque de hibernate apenas voy aprendiendo sobre la marcha y tengo un error que no he podido solucionar. Tengo que crear un examen, seleccionando temas y subtemas deseados, ademas del numero de preguntas por seccion (v/f,relacion columnas, etc), a partir de estos datos obtengo aleatoriamente los reactivos que cumplan las condiciones, todo este proceso ya lo tengo y funciona bien, el problema es cuando quiero salvar el examen, pues me guarda correctamente los datos en la tabla "examen", pero en la tabla intermerdia entre "examen" y "reactivo" que es donde guardo las claves del examen y los reactivos que lo componen ya no se guarda nada, pues me arroja un "Illegal attempt to associate a collection with two open sessions", se que es por que tengo dos sesiones abiertas, el problema es que si las cierro me marca que la sesion esta cerrada, la verdad es que aun no estoy seguro de estar haciendo correctamente los DAO, a continuacion pondre los codigos de los DAO's que utilizo y las partes del controlador donde accedo a ellos, ojala puedan ayudarme, gracias.

Ah, olvidaba aclarar algo curioso, este error solo me lo marca en mi primer intento de registrar un examen despues de correr la aplicacion, en los siguientes intentos todo va sin problemas.

***codigo del controlador***
 
***Codigo de los DAO***
 

Los daos para temas y subtemas no los pongo por que tienen la misma estructura que estos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

cerrar sesiones

getProfesor() debería cerrar la sesión que abrió y createExamen() debería cerrar la sesión que abrió. O si tienes código para cerrar la sesión de hibernate cuando se termina de ejecutar el código de JSF (o sea si tienes implementado el patrón OpenSessionInView) entonces deberías abrir una sola sesión al comenzar a ejecutarse el código de JSF y en el DAO usar un método para obtener la sesión que ya está abierta.

Sacar la transaccion

Por lo que veo en tus metodos de los DAO tienes los commits y rollbacks y te puede ocacionar algunos problemas. Imagina que se inserta exitosamente el examen, pero no reactivo, esto te hara tener un examen en la BD pero no el reactivo y pues es todo o nada (el examen y el reactivo o ninguno de los dos), esto que es, tienes dos transacciones en lugar de una o mas si insertas en mas tablas.
Lo que te aconsejo es sacar la parte donde inicias y terminas la transacción fuera de los daos y meterla por ejemplo en la capa de negocio y dentro de estra transaccion llamar a los daos y talvez pasarle la sessión a los DAOS con un setSession o algo así para que tengas una sola transacción para todos los insertas y el beneficio de una sola sesión para evitar tu problema.

Te quedaria algo asi (va con errores solo es algo conceptual:
 

Imagen de zlatan_ibrahimovic

gracias

Muchas gracias a los dos por su respuesta, lo he podido solucionar con algo muy similar a lo que dijo luigi