Pregunta

Tengo un método que devuelve muchos datos, ¿debo usar @TransactionAttribute (TransactionAttributeType.NOT_SUPPORTED) para este método. El método realiza una consulta JPA y carga el contenido completo de una tabla (aproximadamente 1000 filas).

¿Fue útil?

Solución

El cliente para este método: ¿ya está en una transacción? Cuando use NotSupported, se suspenderá la transacción del llamante. Si no, yo diría, simplemente ponga Nunca como tipo de transacción. Nunca es mejor ya que las personas que llaman saben que no deben llamar a este método desde una transacción. Un contrato más directo.

Siempre usamos Never para métodos que realizan más procesamiento para que los desarrolladores sepan de inmediato que no deben llamar si ya están involucrados en una transacción. Espero que ayude.

Otros consejos

Me gustaría estar en desacuerdo ya que rara vez sucede que el usuario no está en una transacción en casi todos los sistemas. El mejor enfoque es usar NO SOPORTADO para que la transacción se suspenda si la persona que llama ya está en alguna transacción. NUNCA es problemático a menos que tenga una serie de llamadas que no se encuentren en ningún ámbito de TRANSACCIÓN. En resumen, NO SOPORTADO es el tipo que se debe usar.

Hasta donde yo sé (al menos este es el caso con Hibernate), no puede usar JPA fuera de una transacción ya que el ciclo de vida del administrador de la entidad está vinculado al ciclo de vida de la transacción. Entonces, el método real que realiza la consulta debe ser transaccional.

Sin embargo, puede establecerlo en TransactionAttributeType.REQUIRES_NEW ; esto suspendería cualquier transacción existente, comenzará una nueva y la detendrá cuando regrese el método. Eso significa que todas sus entidades se separarían cuando lleguen a la persona que llama, que es lo que parece que está tratando de lograr.

En sistemas más complejos, vale la pena separar completamente su capa de datos de su capa empresarial y crear un nuevo conjunto de objetos. Su método llamará a la consulta JPA, luego usará las entidades devueltas para completar los objetos de su capa empresarial y las devolverá. De esa manera, la persona que llama nunca podrá tener en sus manos las entidades JPA reales y usted es libre de hacer en su capa de datos lo que quiera, ya que ahora es solo un detalle de implementación. (Diablos, podría cambiar la llamada de la base de datos a una llamada API remota y su interlocutor no tendría que saberlo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top