Olá pessoal,
Estou iniciando o desenvolvimento de uma aplicação, e estou usando JSF (Myfaces 1.2.2 + Tomahawk 1.1.8) + Hibernate 3.2 (com annotations), e estou passando por uma dificuldade, que já tentei pesquisar, e até encontrei algumas possíveis soluções, mas nenhuma resolveu o meu problema.
Eu tenho 2 classes modelo: Veiculo e Categoria, em veiculo eu coloquei um relacionamento @ManyToOne em Veiculo, e na tabela existe um campo categoria_id. Até ai tudo certo, eu montei uma tela que lista os registros da tabela veiculo e outra para editar os dados, quando tento alterar o relacionamento de Veiculo x Categoria, eu tenho o erro baixo:
HibernateException: identifier of an instance of was altered from 3 to 1
As minhas classes estão desta forma:
@Entity
@Proxy(lazy=true)
public class Veiculo implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column
private Integer niVeiculo;
@JoinColumn(name = "categoria_id", referencedColumnName = "id" , insertable = false, updatable = false)
@ManyToOne
private Categoria categoria;
@Column(length = 50)
private String marca;
@Column(length = 50)
private String modelo;
@Column
private Integer anoFabric;
@Column
private Integer anoModelo;
@Column(length = 20)
private String ipvaMes;
@ManyToOne
private TipoCombustivel tipoCombustivel;
@Column(length = 8)
private String placaAnt;
@Column(length = 8)
private String placaAtual;
@Column
private Short potencia;
@Column(length = 15)
private String cor;
@Column(length = 10)
private String renavan;
@Column(length = 30)
private String chassi;
@Column
private Short maxPassageiros;
@Column
private Short capacidTanque;
@Column
private Timestamp dataAquisicao;
@ManyToOne
private TipoAquisicao tipoAquisicao;
@Column(length = 25)
private String nomeFornecedor;
@Column(precision = 10, scale = 2)
private BigDecimal valorAquisicao;
@Column(precision = 10, scale = 2)
private BigDecimal valorMercado;
@Column(name = "licenciamento_data")
private Timestamp licenciamentoData;
@Column(precision = 10, scale = 2)
private BigDecimal licenciamentoValor;
@ManyToOne
private EstadoVeiculo estado;
public Veiculo() {
}
// +++ GETS E SETS ++++
}
@Entity
@Proxy(lazy = true)
public class Categoria{
@Id
@GeneratedValue
private Long id;
@Column(length = 50)
private String descricao;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Long toLong(){
return getId();
}
public String toString(){
return String.valueOf(getId());
}
}
O método que salva, no controlador é este:
public String salva() {
VeiculoDao dao = new VeiculoDao();
HibernateTransactionUtil.beginCurrentTransaction();
try {
Categoria categoria = (Categoria) dao.recuperaPorId(veiculo.getCategoria().getId(), Categoria.class);
veiculo.setCategoria(categoria);
dao.salva(veiculo, veiculo.getId());
} catch (Exception e) {
System.out.println(e);
}
try {
HibernateTransactionUtil.commitCurrentTransaction();
} catch (Exception e) {
System.out.println(e);
HibernateTransactionUtil.rollbackCurrentTransaction();
}
return "ListaVeiculos";
}
e no DAO:
public void salva(Object objectTO, Long idValue) {
Session session = getCurrentSession();
try {
session.save(objectTO);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Alguem já passou por problema semelhante, ou saberia me dizer alguma coisa a respeito deste erro?
Ah, ele ocorre na hora do commit.
Obrigado!!!