Olá Pessoal
Estou usando JSF com Hibernate, gostaria de saber se é normal o hibernate sempre fazer uma consulta no banco antes de persistir (merge) o objeto no BD.
Abs.
Olá Pessoal
Estou usando JSF com Hibernate, gostaria de saber se é normal o hibernate sempre fazer uma consulta no banco antes de persistir (merge) o objeto no BD.
Abs.
Como você está implementando esse processo?
Normal não é, mas isso é muito vago para se concluir sem uma análise mais adequada.
Cara para ficar mais fácil, vou colocar um exemplo bem simples:
Um modelo bem simples:
imports....
@Entity
@Table(name="pessoa")
public class Pessoa implements Serializable {
private static final long serialVersionUID = 4430442550334284270L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_pessoa")
private Integer id;
@Column(name="nm_pessoa")
private String nomeCompleto;
get... set...
hashCode...
}
Agora o bean:
@ManagedBean
@ViewScoped
public class PessoaBean implements Serializable {
private static final long serialVersionUID = 1902384631923162403L;
private Pessoa pessoa;
public PessoaBean() {
this.pessoa = new Pessoa();
}
get/set...
public void salvarPessoa(){
PessoaDAO pessoaDAO = new PessoaDAO();
this.pessoaDAO.salvar(this.pessoa);
}
}
Agora o XHTML:
<h:form id="frm" prependId="false">
<p:panel id="panel1">
<h:inputText id="edtNome" value="#{pessoaBean.pessoa.nomeCompleto}" />
<p:commandButton value="Salvar" action="#{pessoaBean.salvarPessoa}" update="panel1" />
</p:panel>
</h:form>
O problema é que sempre que clico no botão Salvar ele faz uma consulta e um update, a impressão que dá é que ele faz a consulta para saber se o registro foi alterado, se foi ele faz o update, se não foi ele nem faz o update.
Qualquer ajuda é bem vinda…
[quote=mribeiro]Cara para ficar mais fácil, vou colocar um exemplo bem simples:
Um modelo bem simples:
imports....
@Entity
@Table(name="pessoa")
public class Pessoa implements Serializable {
private static final long serialVersionUID = 4430442550334284270L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_pessoa")
private Integer id;
@Column(name="nm_pessoa")
private String nomeCompleto;
get... set...
hashCode...
}
Agora o bean:
@ManagedBean
@ViewScoped
public class PessoaBean implements Serializable {
private static final long serialVersionUID = 1902384631923162403L;
private Pessoa pessoa;
public PessoaBean() {
this.pessoa = new Pessoa();
}
get/set...
public void salvarPessoa(){
PessoaDAO pessoaDAO = new PessoaDAO();
this.pessoaDAO.salvar(this.pessoa);
}
}
Agora o XHTML:
<h:form id="frm" prependId="false">
<p:panel id="panel1">
<h:inputText id="edtNome" value="#{pessoaBean.pessoa.nomeCompleto}" />
<p:commandButton value="Salvar" action="#{pessoaBean.salvarPessoa}" update="panel1" />
</p:panel>
</h:form>
O problema é que sempre que clico no botão Salvar ele faz uma consulta e um update, a impressão que dá é que ele faz a consulta para saber se o registro foi alterado, se foi ele faz o update, se não foi ele nem faz o update.
Qualquer ajuda é bem vinda…[/quote]
Com essa estrutura, nunca vai ocorrer o select quando você fizer o merge.
Sem o cenário real, não há como saber.
Esse é o cenário real…
Fiz isso num projeto a parte para analisar o comportamento e ele fez exatamente isso, um SELECT no objeto Pessoa antes de persistir.
Alguém poderia dar alguma dica?
Abs.
Isso não ocorre.
Uma possibilidade é você realizar um refresh antes do merge, neste caso, com certeza esse select acontece.
O máximo que poderia acontecer era você ter carregado o objeto em uma sessão e realizar o merge em outra, o que provavelmente lançaria a exceção “detached object”, mas sem isso, eu nunca vi nada igual e até creio que não seja possível.
Enfim…