check if entity is change
szaccaria Aug 1, 2007 6:27 AMHi to all,
It is possible to know if a entity it is changed after submit a form and first the entityManager flush this change in db? I make this kind of question because I need to controll if a entity be changed from the user, so I can sign a flag.
Morover I have the follow SFSB
@Stateful @Scope(ScopeType.CONVERSATION) @Name("gestione") public class Gestione implements GestioneI { @PersistenceContext(type = PersistenceContextType.EXTENDED) EntityManager entityManager; @Out(scope = ScopeType.CONVERSATION, required = false) Documento doc; @In(required = false) Long idDocumento; @In(required = false) TaskInstance taskInstance; @In private Actor actor; @Logger private Log log; @DataModel private List<TaskInstance> taskInstacesResponsabile; @DataModelSelection private TaskInstance task; private String tab; @StartTask(flushMode=FlushModeType.MANUAL) public String iniziaValutazioneDoc(String tab) { String out = continuaValutazioneDoc(tab); return out; } @BeginTask(flushMode=FlushModeType.MANUAL) public String continuaValutazioneDoc(String tab) { this.tab = tab; doc = (Documento) entityManager.createQuery("select distinct d from Documento d where d.id = :id").setParameter("id", idDocumento).getSingleResult(); return "/documento.xhtml"; } @BeginTask @EndTask(transition = "confermato") public String chiudiValutazioneDoc(String tab) { if (taskInstance.getStart() == null) taskInstance.start(); this.tab = tab; return "/todo2.xhtml"; } @EndTask(transition = "confermato") public String confermaAInterno(String tab) { taskInstance.setActorId((String)taskInstance.getVariable("responsabile")); taskInstance.setVariable(getTrackVariableNameForActor(actor), actor.getId()); this.tab = tab; return "/todo.xhtml"; } @End public String sospendiValutazioneDoc(String tab) { this.tab = tab; return "/todo2.xhtml"; } @Destroy @Remove public void destroy() { } public void caricaTasksInCarico() { JbpmContext context = ManagedJbpmContext.instance(); taskInstacesResponsabile = context.getSession().createQuery( "select ti "+ "from org.jbpm.taskmgmt.exe.TaskInstance ti, "+ " org.jbpm.context.exe.VariableInstance vi join vi.processInstance pi " + "where " + " pi.end = null and " + " ti.token.processInstance = pi and " + " vi.name = :track and " + " vi.value = :trackValue and " + " ( ti.actorId = null or ti.actorId != :actorId ) and " + " ti.isOpen = true" ).setString("track", getTrackVariableNameForActor(actor)).setString("trackValue",actor.getId()).setString("actorId", actor.getId()).list(); for (Iterator iter = taskInstacesResponsabile.iterator(); iter.hasNext();) { TaskInstance element = (TaskInstance) iter.next(); log.error("TaskInstance n° #0 di #1", element.getId(), element.getActorId()); } } /** * Genero il documento pdf in memoria */ public String stampaDocumento() { FacesContext faces = FacesContext.getCurrentInstance(); ByteArrayOutputStream bAOS = PdfUtility.stampaPDF(doc); HttpServletResponse response = (HttpServletResponse) faces.getExternalContext().getResponse(); response.setContentType("application/pdf"); response.setContentLength(bAOS.size()); response.setHeader("Content-disposition", "Attachment; filename=\"" + doc.getClifor() + "_" + doc.getNumdoc() + ".pdf" + "\""); try { ServletOutputStream out; out = response.getOutputStream(); out.write(bAOS.toByteArray()); } catch (IOException e) { e.printStackTrace(); } faces.responseComplete(); return null; } public String consultazioneDocumento( String tab) { doc = (Documento) entityManager.createQuery("select distinct d from Documento d where d.id = :id").setParameter("id", task.getVariable("idDocumento")) .getSingleResult(); this.tab = tab; return "/documento.xhtml"; } public String salvaDocumento() { entityManager.persist(doc); return null; } public TaskInstance getTaskInstance() { return taskInstance; } public void setTaskInstance(TaskInstance taskInstance) { this.taskInstance = taskInstance; } /** * Mi torna il nome della variabile track per l'utente actor */ private String getTrackVariableNameForActor(Actor actor) { String sActor = actor.getId(); StringBuffer trackBuff = new StringBuffer(); trackBuff.append("trackFor"); if (sActor != null && sActor.trim().length() > 1) { trackBuff.append(sActor.substring(0, 1).toUpperCase()); trackBuff.append(sActor.substring(1)); } return trackBuff.toString(); } }
when I call from a xhtml page the action: gestione.stampaDocumento
like:
<h:form> <h:commandButton action="#{gestione.stampaDocumento}" value="#{messages.generapdf}" style="border: none;" image="/img/pdf.png" title="#{messages.generapdf}" rendered="#{s:hasRole('controllo')}"> </h:commandButton> </h:form>
The possible change that user made to the endity are flush in to the db, although i don't end the conversation, ( flushMode=FlushModeType.MANUAL is set in al @starttask )
Thanks !!!