Hibernate grava em apenas uma tabela

4 respostas
F

Estou fazendo um projeto com eclipse/mysql/hibernate. Quando eu rodo o programa ele grava os dados da tabela funcionario, embora a bonificacao não grave, eis o código:

public static void main(String[] args) {
		Configuration cfg = new Configuration();
		cfg.configure();
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		Session session = sessionFactory.openSession();
				
		try
		{
			DateFormat dt = DateFormat.getDateInstance(DateFormat.SHORT);
			Date novaData = dt.parse("01/10/2078");

			Funcionario f = new Funcionario();		
			f.setNome("Marcio 8");
			f.setMatricula(1111);
			f.setAdmissao(novaData);
			f.setRamal(12);
			
			BonificacaoAnual bonus2003 = new BonificacaoAnual();
			bonus2003.setAno(2003);
			bonus2003.setValor(10.0);			
			session.save(f);
			bonus2003.setFuncionario(f);
			f.addBonificacao(bonus2003);			
			
			session.save(bonus2003);
			System.out.println("id func: " + f.getId());
			System.out.println("bonus: " + bonus2003);
		}catch(Exception ex)
		{
			System.out.println(ex.getMessage());
		}			
		
		session.close();
		sessionFactory.close();
	}

ocorre o seguinte erro:

19:29:56,984 DEBUG AbstractSaveEventListener:240 - executing insertions
19:29:56,984 DEBUG AbstractSaveEventListener:289 - executing identity-insert immediately
19:29:56,984 DEBUG AbstractEntityPersister:2094 - Inserting entity: my.model.BonificacaoAnual (native id)
19:29:56,984 DEBUG AbstractBatcher:358 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
19:29:56,984 DEBUG SQL:393 - insert into bonificacaoanual (ano, valor) values (?, ?)
19:29:56,984 DEBUG AbstractBatcher:476 - preparing statement
19:29:57,000 DEBUG AbstractEntityPersister:1942 - Dehydrating entity: [my.model.BonificacaoAnual#<null>]
19:29:57,000  INFO BigDecimalType:87 - could not bind value '10.0' to parameter: 2; java.lang.Double
19:29:57,000 DEBUG AbstractBatcher:366 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
19:29:57,000 DEBUG AbstractBatcher:525 - closing statement
java.lang.Double
19:29:57,000 DEBUG SessionImpl:273 - closing session

codigo da bonificacao anual:

package my.model;

public class BonificacaoAnual {

	private Long id;
	private int ano;
	private double valor;
	private Funcionario funcionario;
			
	public boolean equals(Object o) {
		return funcionario.equals(o);
	}
	public int hashCode() {
		return funcionario.hashCode();
	}
	public int getAno() {
		return ano;
	}
	public void setAno(int ano) {
		this.ano = ano;
	}
	public double getValor() {
		return valor;
	}
	public void setValor(double valor) {
		this.valor = valor;
	}
	public Funcionario getFuncionario() {
		return funcionario;
	}
	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
}

codigo da funcionario

package my.model;

import java.util.Collection;
import java.util.Date;

public class Funcionario {

	private Integer id;
	private String nome;
	private int ramal;
	private int matricula;
	private Date admissao;
	private Collection bonificacoes;
	
	public boolean addBonificacao(BonificacaoAnual ba){
		if(getBonificacoes()==null) return false;
		if(! this.equals(ba.getFuncionario())){
			if(ba.getFuncionario()!=null){
				ba.getFuncionario().getBonificacoes().remove(ba);
			}
			ba.setFuncionario(this);
		}
		return getBonificacoes().add(ba);
	}
	
	public boolean equals(Object o){
		if (this == o) return true;
		if (o == null) return false;
		if(!(o instanceof Funcionario)) return false;
		Funcionario that = (Funcionario) o;
		return this.getMatricula() == that.getMatricula();
	}
	
	public int hashCode(){
		return this.getMatricula();
	}

	public Date getAdmissao() {
		return admissao;
	}
	public void setAdmissao(Date admissao) {
		this.admissao = admissao;
	}
	public Collection getBonificacoes() {
		return bonificacoes;
	}
	public void setBonificacoes(Collection bonificacoes) {
		this.bonificacoes = bonificacoes;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public int getMatricula() {
		return matricula;
	}
	public void setMatricula(int matricula) {
		this.matricula = matricula;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public int getRamal() {
		return ramal;
	}
	public void setRamal(int ramal) {
		this.ramal = ramal;
	}
}

4 Respostas

C

Tem que criar e dar commit na transacao.

F

eu coloquei o commit mas ainda não está funcionando, da o seguinte erro:

21:02:33,921 DEBUG AbstractBatcher:476 - preparing statement
21:02:33,921 DEBUG AbstractEntityPersister:1942 - Dehydrating entity: [my.model.BonificacaoAnual#<null>]
21:02:33,921  INFO BigDecimalType:87 - could not bind value '10.0' to parameter: 2; java.lang.Double
21:02:33,921 DEBUG AbstractBatcher:366 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
21:02:33,921 DEBUG AbstractBatcher:525 - closing statement
java.lang.Double
21:02:33,921 DEBUG SessionImpl:273 - closing session
21:02:33,921 DEBUG ConnectionManager:374 - performing cleanup
21:02:33,921 DEBUG ConnectionManager:435 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
21:02:33,921 DEBUG DriverManagerConnectionProvider:129 - returning connection to pool, pool size: 1
21:02:33,921 DEBUG JDBCContext:215 - after transaction completion
try
		{
			DateFormat dt = DateFormat.getDateInstance(DateFormat.SHORT);
			Date novaData = dt.parse("01/10/2078");

			Funcionario f = new Funcionario();		
			f.setNome("Marcio 8");
			f.setMatricula(1111);
			f.setAdmissao(novaData);
			f.setRamal(12);
			
			BonificacaoAnual bonus2003 = new BonificacaoAnual();
			bonus2003.setAno(2003);
			bonus2003.setValor(10.0);			
			session.save(f);
			session.connection().commit();
			bonus2003.setFuncionario(f);
			f.addBonificacao(bonus2003);			
			
			session.connection().commit();
			session.save(bonus2003);
			System.out.println("id func: " + f.getId());
			System.out.println("bonus: " + bonus2003);
		}catch(Exception ex)
		{
			System.out.println(ex.getMessage());
		}
F

Alguém já pegou esse problema?
se por acaso é na hora de gravar ou sei lá, alguém poderia me ajudar?

D

Olha, posso estar falando besteira. Mas vi alguns problemas no seu mapeamento.

Primeiro: o erro está na atribuição da coluna valor. Valor está mapeado como BigDecimal, e no seu POJO está como double. Das duas uma: ou mude valor para BigDecimal, ou tire o tipo type=“big_decimal” (que na verdade deveria ser type=“java.math.BigDecimal”) que o hibernate vai ver automaticamente que é um double.

Segundo: pela minha parca experiência em Hibernate, quando você mapeia uma propriedade vc tem q colocar exatamente como ela está depois do get correspondente. Logo, por exemplo, no mapeamento de valor deve estar name=“Valor” e não name=“valor” com v minúsculo, pois no POJO está public double getValor().

Bem, deve ser isso… Qualquer coisa, ou se eu fui muito prolixo, mande resposta!

Abs

Criado 30 de janeiro de 2007
Ultima resposta 1 de fev. de 2007
Respostas 4
Participantes 3