Bom dia,
Estou iniciando no desenvolvimento com JSF + JPA pois surgiu a necessidade de desenvolver um ERP em Java Web. Tenho experiência com desenvolvimento Forms (C#/VB.NET/VB6), Android e Flex.
[b]Venho lendo a documentação tanto do Hibernate e do PrimeFaces, mas sinto às vezes um certo problema em termos de performance.
Também tenho tido dúvidas e problemas com relação a qual seria a configuração correta do WildFly nesse estilo de projeto que seria um ERP onde vários usuários estariam “pendurados” no sistema gravando, consultando e etc. Pois tive problemas com o Pool de conexões.[/b]
Gostaria de saber se alguém teria dicas para ajudar e no que devo focar para desenvolver um projeto deste tamanho com alta performance. Talvez alguma documentação mais focada e técnicas para analise de performance e dicas em geral.
Abaixo um exemplo de como venho modelando uma tela do sistema, talvez esteja fazendo algo de errado:
Entidade Embalagem:
[code]@Entity
@Table(name = “embalagens”)
@Data
@EqualsAndHashCode(callSuper = false)
public class Embalagem extends AppModel implements Serializable {
@Id
@Column(name = "id", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "embalagemSeq")
@SequenceGenerator(name = "embalagemSeq", sequenceName = "embalagens_id_seq", allocationSize = 1)
private Integer id;
@Column(name = "descricao", nullable = false, length = 60)
private String descricao;
@Column(name = "volume", precision = 12, scale = 3)
private BigDecimal volume;
}[/code]
Controller:
[code]@Named(“embalagensController”)
@ViewScoped
public class EmbalagensController extends AppController implements Serializable {
@Getter private List<Embalagem> embalagens;
@Getter @Setter private Embalagem embalagem;
@PostConstruct
public void fetchEmbalagens() {
embalagens = getEntityManager().createQuery(
"SELECT e FROM Embalagem e ORDER BY e.descricao",
Embalagem.class).getResultList();
}
public void editEmbalagem(Embalagem embalagem) {
this.embalagem = embalagem;
}
@Transactional(rollbackOn = { Exception.class })
public void removeEmbalagem(Embalagem embalagem) {
removeDetached(getEntityManager(), embalagem);
embalagens.remove(embalagem);
}
public void newEmbalagem() {
embalagem = new Embalagem();
}
@Transactional(rollbackOn = { Exception.class })
public void postEmbalagem() {
getEntityManager().merge(embalagem);
fetchEmbalagens();
}
public void cancelEmbalagem() {
embalagem = null;
}
}[/code]
E a View:
[code]
<ui:define name="title">Embalagens</ui:define>
<ui:define name="content">
<h:form id="embalagensForm">
<p:growl id="embalagensMessages" showDetail="false" />
<p:dataTable id="embalagensTable"
value="#{embalagensController.embalagens}" var="e">
<f:facet name="header">
<p:commandButton icon="fa fa-plus-circle" actionListener="#{embalagensController.newEmbalagem}" update=":embalagemDialog"
oncomplete="PF('embalagemDialog').show();" />
</f:facet>
<p:column headerText="Código" style="text-align: center; width: 80px;">
<h:outputText value="#{e.id}" />
</p:column>
<p:column headerText="Descrição">
<h:outputText value="#{e.descricao}" />
</p:column>
<p:column headerText="Volume (m³)" style="text-align: center; width: 80px;">
<h:outputText value="#{e.volume}">
<f:convertNumber pattern=",##0.000" locale="pt_BR" />
</h:outputText>
</p:column>
<p:column style="text-align: center; width: 16px;">
<p:commandLink action="#{embalagensController.editEmbalagem(e)}" update=":embalagemDialog"
oncomplete="PF('embalagemDialog').show();">
<i class="fa fa-edit"></i>
</p:commandLink>
</p:column>
<p:column style="text-align: center; width: 16px;">
<p:commandLink action="#{embalagensController.removeEmbalagem(e)}" update="embalagensTable">
<p:confirm header="Excluir" message="Confirma excluir embalagem?" icon="fa fa-question-circle" />
<i class="fa fa-trash-o"></i>
</p:commandLink>
</p:column>
</p:dataTable>
</h:form>
<p:dialog header="Embalagem" id="embalagemDialog" widgetVar="embalagemDialog" modal="true" resizable="false">
<h:form id="embalagemForm">
<p:growl id="embalagemMessages" showDetail="false" />
<p:panelGrid columns="2" styleClass="transparentGrid">
<p:outputLabel for="idText" value="Código:" rendered="#{embalagensController.embalagem.id ne null}" />
<p:inputText id="idText" value="#{embalagensController.embalagem.id}" size="5" readonly="true" rendered="#{embalagensController.embalagem.id ne null}" />
<p:outputLabel for="descricaoText" value="Descrição:" />
<p:inputText id="descricaoText" value="#{embalagensController.embalagem.descricao}" size="20" required="true" requiredMessage="Descrição da embalagem não informada." />
<p:outputLabel for="volumeText" value="Volume (m³):" />
<p:inputText id="volumeText" value="#{embalagensController.embalagem.volume}" size="20">
<f:convertNumber pattern=",##0.000" locale="pt_BR" />
</p:inputText>
<f:facet name="footer">
<p:commandButton id="okButton" icon="fa fa-check" value="OK"
action="#{embalagensController.postEmbalagem}" update="embalagemMessages,:embalagensForm:embalagensTable"
oncomplete="handleDialogRequest(xhr, status, args, PF('embalagemDialog'));" />
<p:commandButton id="cancelarButton" icon="fa fa-close" value="Cancelar" immediate="true"
action="#{embalagensController.cancelEmbalagem}"
oncomplete="PF('embalagemDialog').hide();" />
</f:facet>
</p:panelGrid>
<p:defaultCommand target="okButton" />
</h:form>
</p:dialog>
</ui:define>
</ui:composition>
</h:body>
[/code]