Senhores, estou aqui postando meu problema porque não consigo resolver nem com mandinga…
Antes de descrever o problema informo que eu tive que formatar o computador e antes da formatação funcionava que era uma beleza.
Eu faço a busca dos dados de um objeto e assim que altero sua propriedade, o hibernate executa um comando de alteração (update).
Segue abaixo os códigos
mysql_hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sistemasaas</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.show_sql">true</property>
<!-- Define o tamanho do cache para processamentos em lote -->
<property name="hibernate.jdbc.batch_size">100</property>
<!-- define que o método getCurrentSession retornará a sessão corrente -->
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">create-update</property>
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.max_size">40</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">100</property>
<!--
Mapeando as classes de entidade
-->
<mapping class="apisaas.adesao.Adesao"/>
<mapping class="apisaas.administrador.Administrador"/>
<mapping class="apisaas.cancelamento.Cancelamento"/>
<mapping class="apisaas.endereco.Cidade"/>
<mapping class="apisaas.cliente.Cliente"/>
<mapping class="apisaas.contrato.Contrato"/>
<mapping class="apisaas.endereco.Estado"/>
<mapping class="apisaas.modulo.Modulo"/>
<mapping class="apisaas.pagamento.Pagamento"/>
<mapping class="apisaas.parametro.ParametroAdmin"/>
<mapping class="apisaas.parametro.ParametroGlobal"/>
<mapping class="apisaas.pessoa.Pessoa"/>
<mapping class="apisaas.politicadepreco.PoliticaDePreco"/>
<mapping class="apisaas.tipodecliente.TipoDeCliente"/>
</session-factory>
</hibernate-configuration>
Classe Adesao:
package apisaas.adesao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
import apisaas.modulo.Modulo;
@Entity
@Table
@Inheritance(strategy=InheritanceType.JOINED)
public class Adesao implements Serializable {
private static final long serialVersionUID = 858345758170078424L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column
private int id;
@Column(length=50, nullable=false, unique = true)
@NotEmpty(message="Informe a descrição da adesão")
@Size(min=1, max=50, message="A descrição da adesão deve possuir no mínimo {min} e no máximo {max} caracteres")
private String descricao;
@Column(nullable=false)
@org.hibernate.annotations.Check(constraints="duracao > 0")
@Min(value=1, message="A duração da adesão deve ter no mínimo um mês")
private int duracao;
@Column(nullable=false)
@NotNull(message="Informe se a adesão é grátis ou não")
private boolean gratis;
@Lob
@Column(nullable=false)
@NotEmpty(message="Informe o detalhamento da adesão")
private String detalhamento;
@Column(nullable=false)
@NotNull(message="Informe se a adesão está ativa ou não")
private boolean ativo;
@ManyToMany(fetch=FetchType.EAGER)
@org.hibernate.annotations.Fetch(org.hibernate.annotations.FetchMode.SELECT)
@JoinTable(
name = "AdesaoModulo",
joinColumns = @JoinColumn(name = "adesao"),
inverseJoinColumns = @JoinColumn(name = "modulo"),
uniqueConstraints = @UniqueConstraint(columnNames = {"adesao", "modulo" })
)
@NotNull(message="Uma adesão deve estar associada a pelo menos um módulo")
private List<Modulo> modulos;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getDuracao() {
return duracao;
}
public void setDuracao(int duracao) {
this.duracao = duracao;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public boolean isGratis() {
return gratis;
}
public void setGratis(boolean gratis) {
this.gratis = gratis;
}
public String getDetalhamento() {
return detalhamento;
}
public void setDetalhamento(String detalhamento) {
this.detalhamento = detalhamento;
}
public boolean isAtivo() {
return ativo;
}
public void setAtivo(boolean ativo) {
this.ativo = ativo;
}
public List<Modulo> getModulos() {
return modulos;
}
public void setModulos(List<Modulo> modulos) {
this.modulos = modulos;
}
@Override
public boolean equals(Object arg0) {
if (this == arg0) {
return true;
}
if (!(arg0 instanceof Adesao))
{
return false;
}
Adesao planoInformado =(Adesao) arg0;
return (planoInformado.getId() == this.id);
}
@Override
public int hashCode() {
return this.id == 0 ? System.identityHashCode(this) : this.id;
}
}
Teste:
try {
HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
AdesaoBusiness<Adesao> business = AdesaoFactory.criarAdesaoBusiness();
Adesao adesao = business.buscar(1);
adesao.setDescricao("teste2");
HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit();
} catch(Exception e) {
HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
e.printStackTrace();
}
Observação: Assim que o teste executa o comando adesao.setDescricao(“teste2”); é executado um comando de update.
Creio que seja alguma configuração…
o hibernate está disparando o update e como o atributo é unique dá erro.