Tengo una aplicación Sandbox Seam 3 con JBoss 7, Hibernate como implementación JPA predeterminada y JSF como interfaz web.JPA/Hibernate no emite ninguna ACTUALIZACIÓN en la confirmación en el entorno EJB/Seam
Tengo el problema de que la ACTUALIZACIÓN de SQL está anulada por defecto.
Mi EJB con estado en el ámbito de conversación mantiene una prolongada con ámbito EntityManager y una entidad, contenedores Transacciones gestionados (Requiere nueva)
- El EntityManager se inyecta
- El EJB utiliza el EM para cargar la Entidad y mantiene en un campo
- aplicación JSF tiene acceso a la EJB y su entidad, cambia un campo cadena método
- calles de aplicaciones JSF "Guardar" en EJB
- en save() Yo verifico, si el campo Entities fue cambiado -> fue cambiado correctamente
- No hago nada más, el contenedor confirma la transacción luego de que save() haya terminado.
- Problema: No se realiza ninguna actualización de SQL en la base de datos.
Si extiendo guardar() por:
a) entityManager.contains (entidad) Se ejecuta la actualización como se esperaba (resultado es "verdadero")
O
b) entityManager.persist (entidad) la ACTUALIZACIÓN se ejecuta como se esperaba
P: Por lo que yo entiendo, las especificaciones ni de a) ob) deben ser requeridas, porque la entidad permanece administrada durante todo el proceso. No entiendo, por qué a) tiene un efecto en el ahorro. Puedo obtener imágenes del b) tiene un efecto en el ahorro, pero no debería ser necesario, ¿o sí?
Cualquier explicación es bienvenida.
Aquí es mi EJB:
@Named
@ConversationScoped
@Stateful
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class LanguageBean {
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
@Inject
private UserTransaction transaction;
private Language value;
@Inject
Conversation conversation;
public LanguageBean() {
super();
}
@Begin
public void selectLanguage(Long anId) {
conversation.setTimeout(10 * 60 * 1000);
if (anId != null) {
value = em.find(Language.class, anId);
}
}
@BeforeCompletion
public void transactionComplete(){
System.out.println("transactionComplete");
}
public Language getValue() {
return value;
}
@Produces
@Named
@ConversationScoped
public Language getLanguage() {
return getValue();
}
public void setValue(Language aValue) {
value = aValue;
}
@End
public String save() {
// displays the changed attribute:
System.out.println("save code: "+value.getCode());
// why is either this required:
// boolean tempContains = em.contains(value);
// System.out.println("managed: "+tempContains);
// or: why is persist required:
em.persist(value);
return "languages?faces-redirect=true";
}
@End
public String cancel() throws SystemException {
transaction.setRollbackOnly();
return "languages?faces-redirect=true";
}
}
que descubrí EntityManager.flush() también resuelve el problema. Pero no entiendo por qué parece ser necesario. De la especificación JPA: "Cuando la transacción JTA se compromete, el proveedor debe eliminar todos los estados de la entidad modificada a la base de datos ". – user1187037
¿quizás en alguna parte el FlushMode de la sesión de hibernación está configurado en none? – Firo