Consulta antes de salvar

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…