Ajuda com Hibernate

28 respostas
G

Prezados, estou desenvolvendo uma aplicação utilizando hibernate, e agora estou testando porem esta dando erro, segue:

Classe POJO

@Entity
@Table(name = "proprietario")
public class Proprietario {

	@IndexColumn(name = "idProprietario_UNIQUE")
	@Id
	@Column(name = "idProprietario", nullable = false)
	private Integer idProprietario;

	@Column(name = "proprietarioNome", nullable = false)
	private String proprietarioNome;

	@Column(name = "numeroArrais", nullable = false)
	private String numeroArrais;

	@Column(name = "cpf", nullable = false)
	private String cpf;

	@Column(name = "telefone", nullable = false)
	private String telefone;

	public Proprietario() {
		this.proprietarioNome = null;
		this.numeroArrais = null;
		this.cpf = null;
		this.telefone = null;
		this.idProprietario = null;
	}

	@Override
	public String toString() {
		return "Proprietario [idProprietario=" + idProprietario + ", proprietarioNome=" + proprietarioNome
				+ ", numeroArrais=" + numeroArrais + ", cpf=" + cpf
				+ ", telefone=" + telefone + "]";
	}

	public Integer getidProprietario() {
		return idProprietario;
	}

	public void setidProprietario(Integer idProprietario) {
		this.idProprietario = idProprietario;
	}

	public String getproprietarioNome() {
		return proprietarioNome;
	}

	public void setproprietarioNome(String proprietarioNome) {
		this.proprietarioNome = proprietarioNome;
	}

	public String getArrais() {
		return numeroArrais;
	}

	public void setArrais(String arrais) {
		this.numeroArrais = arrais;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

}

Classe de Teste

public class ProprietarioController {

	public static void inclusaoDeProprietario(Proprietario registro)
			throws Exception {
		ProprietarioHibernate proHBR = new ProprietarioHibernate();
		if (proHBR.inclui(registro))
			System.out.println("Inserido: " + registro);
	}

	public static void exclusaoDeProprietario(Proprietario registro)
			throws Exception {
		ProprietarioHibernate proHBR = new ProprietarioHibernate();
		if (proHBR.exclui(registro))
			System.out.println("Excluído: " + registro);
	}

	public static void alteracaoDeProprietario(Proprietario registro)
			throws Exception {
		ProprietarioHibernate proHBR = new ProprietarioHibernate();
		if (proHBR.altera(registro))
			System.out.println("Alterado: " + registro);
	}

	public static Proprietario consultaDeProprietario(Proprietario registro)
			throws Exception {
		ProprietarioHibernate proHBR = new ProprietarioHibernate();
		registro = proHBR.consulta(registro);
		if (registro.getidProprietario() > 0)
			System.out.println("Consulta: " + registro);
		return registro;
	}

	public static void listagemDeProprietario() throws Exception {
		ProprietarioHibernate proHBR = new ProprietarioHibernate();
		System.out.println("*****Listando Tudo*******");
		for (Proprietario p : proHBR.listaTudo())
			System.out.println(p);
	}

	public static void listagemDeProprietario(int inicio, int fim)
			throws Exception {
		ProprietarioHibernate proHBR = new ProprietarioHibernate();
		System.out.println("*****Listando Subconjunto Paginado*******");
		for (Proprietario p : proHBR.pagina(inicio, fim))
			System.out.println(p);
	}

	public static void main(String[] args) throws Exception {

		Proprietario registro = new Proprietario();

		registro.setidProprietario(1);
		registro.setproprietarioNome("Jose Antonio");
		registro.setArrais("1256897");
		registro.setCpf("[telefone removido]");
		registro.setTelefone("061-39645985");

		inclusaoDeProprietario(registro);

Meu hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/mydb</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		
		<property name="hibernate.c3p0.min_size">2</property>
		<property name="hibernate.c3p0.max_size">5</property>
		<property name="hibernate.c3p0.timeout">300</property>
		<property name="hibernate.c3p0.max_statements">50</property>
		<property name="hibernate.c3p0.idle_test_period">3000</property>
		<property name="hibernate.c3p0.acquire_increment">2</property>
		
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.generate_statistics">true</property>
		<property name="hibernate.use_sql_comments">true</property>

		<mapping class="br.ucb.pojo.Embarcacao" />
		<mapping class="br.ucb.pojo.JetSki" />
		<mapping class="br.ucb.pojo.Lancha" />
		<mapping class="br.ucb.pojo.Proprietario" />
	
		 
	</session-factory>
</hibernate-configuration>

Erro que esta dando:

01:32:32  INFO [Version             ] Hibernate Commons Annotations 3.2.0.Final
01:32:32  INFO [Environment         ] Hibernate 3.6.5.Final
01:32:32  INFO [Environment         ] hibernate.properties not found
01:32:32  INFO [Environment         ] Bytecode provider name : javassist
01:32:32  INFO [Environment         ] using JDK 1.4 java.sql.Timestamp handling
01:32:32  INFO [Configuration       ] configuring from resource: /hibernate.cfg.xml
01:32:32  INFO [Configuration       ] Configuration resource: /hibernate.cfg.xml
01:32:32  WARN [DTDEntityResolver   ] recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
01:32:32  INFO [Configuration       ] Configured SessionFactory: null
01:32:33  INFO [AnnotationBinder    ] Binding entity from annotated class: br.ucb.pojo.Embarcacao
01:32:33  INFO [EntityBinder        ] Bind entity br.ucb.pojo.Embarcacao on table embarcacao
01:32:33  INFO [AnnotationBinder    ] Binding entity from annotated class: br.ucb.pojo.JetSki
01:32:33  INFO [EntityBinder        ] Bind entity br.ucb.pojo.JetSki on table jetski
Exception in thread "main" java.lang.ClassCastException: org.hibernate.mapping.JoinedSubclass cannot be cast to org.hibernate.mapping.RootClass
	at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:209)
	at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:200)
	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2061)
	at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1856)
	at br.ucb.hibernate.ProprietarioHibernate.<init>(ProprietarioHibernate.java:26)
	at br.ucb.aplicacao.ProprietarioController.inclusaoDeProprietario(ProprietarioController.java:10)
	at br.ucb.aplicacao.ProprietarioController.main(ProprietarioController.java:63)

Alguem sabe me dar uma dica?

28 Respostas

wagnerfrancisco

O erro possivelmente está numa outra classe (Embarcacao, JetSki…).

Lembre-se que o Hibernate lê todas as suas entidades no início, então mesmo que vc esteja tentando apenas inserir um Proprietario, o erro pode estar em outra classe. Deve ser algum problema com Join. Poste as outras classes para vermos!

E uma dica, o construtor que você criou na classe Proprietario (atribuindo tudo para null) é inútil. Este é o comportamento padrão se você não atribuir nada.

G

Segue o codigo das outras classes:

JetSki POJO

@Entity
@DiscriminatorValue("2")
@Table(name = "jetski")
public class JetSki extends Embarcacao {
	private static final long serialVersionUID = 1L;

	@IndexColumn(name = "idJetski_UNIQUE")
	@Id
	@Column(name = "idJetski", nullable = false)
	private Integer idJetski;

	@Column(name = "jetComprimento", nullable = false)
	private String jetComprimento;

	@Column(name = "jetPotenciaMotor", nullable = false)
	private String jetPotenciaMotor;

	@Column(name = "jetAno", nullable = false)
	private String jetAno;

	@Column(name = "jetQuantidadePessoas", nullable = false)
	private String jetQuantidadePessoas;

	@Column(name = "jetModelo", nullable = false)
	private String jetModelo;

	@Column(name = "jetMarca", nullable = false)
	private String jetMarca;

	@Column(name = "jetTipoMotor", nullable = false)
	private String jetTipoMotor;

	@IndexColumn(name = "jet_FKIndex1")
	@ForeignKey(name = "jet_FKIndex1")
	@OneToOne
	@JoinColumn(name = "idEmbarcacao", insertable = true, updatable = true)
	private Embarcacao embarcacao;

	public Integer getidJetski() {
		return idJetski;
	}

	public void setidJetski(Integer idJetski) {
		this.idJetski = idJetski;
	}

	public String getJetComprimento() {
		return jetComprimento;
	}

	public void setJetComprimento(String jetComprimento) {
		this.jetComprimento = jetComprimento;
	}

	public String getJetPotenciaMotor() {
		return jetPotenciaMotor;
	}

	public void setJetPotenciaMotor(String jetPotenciaMotor) {
		this.jetPotenciaMotor = jetPotenciaMotor;
	}

	public String getJetAno() {
		return jetAno;
	}

	public void setJetAno(String jetAno) {
		this.jetAno = jetAno;
	}

	public String getJetQuantidadePessoas() {
		return jetQuantidadePessoas;
	}

	public void setJetQuantidadePessoas(String jetQuantidadePessoas) {
		this.jetQuantidadePessoas = jetQuantidadePessoas;
	}

	public String getJetModelo() {
		return jetModelo;
	}

	public void setJetModelo(String jetModelo) {
		this.jetModelo = jetModelo;
	}

	public String getJetMarca() {
		return jetMarca;
	}

	public void setJetMarca(String jetMarca) {
		this.jetMarca = jetMarca;
	}

	public String getJetTipoMotor() {
		return jetTipoMotor;
	}

	public void setJetTipoMotor(String jetTipoMotor) {
		this.jetTipoMotor = jetTipoMotor;
	}

	public Embarcacao getEmbarcacao() {
		return embarcacao;
	}

	public void setEmbarcacao(Embarcacao embarcacao) {
		this.embarcacao = embarcacao;
	}

	public JetSki() {
		super();
		this.idJetski = null;
		this.jetAno = null;
		this.jetComprimento = null;
		this.jetMarca = null;
		this.jetModelo = null;
		this.jetPotenciaMotor = null;
		this.jetQuantidadePessoas = null;
		this.jetTipoMotor = null;
		this.setEmbarcacao(new Embarcacao());
	}

	public String toString() {
		return ("{" + super.toString() + "\\" + this.idJetski + "\\"
				+ this.jetAno + "\\" + this.jetComprimento + "\\"
				+ this.jetMarca + "}" + this.jetModelo + "}" + this.jetPotenciaMotor
				+ "}" + this.jetQuantidadePessoas + "}" + this.jetTipoMotor + "}");
	}
}

Lancha POJO

@Entity
@DiscriminatorValue("1")
@Table(name = "lancha")
public class Lancha extends Embarcacao {
	private static final long serialVersionUID = 1L;

	@IndexColumn(name = "idLancha_UNIQUE")
	@Id
	@Column(name = "idLancha", nullable = false)
	private Integer idLancha;

	@Column(name = "lanchaComprimento", nullable = false)
	private String lanchaComprimento;

	@Column(name = "lanchaPotenciaMotor", nullable = false)
	private String lanchaPotenciaMotor;

	@Column(name = "lanchaAno", nullable = false)
	private String lanchaAno;

	@Column(name = "lanchaQuantidadePessoas", nullable = false)
	private String lanchaQuantidadePessoas;

	@Column(name = "lanchaModelo", nullable = false)
	private String lanchaModelo;

	@Column(name = "lanchaMarca", nullable = false)
	private String lanchaMarca;

	@Column(name = "lanchaTipoMotor", nullable = false)
	private String lanchaTipoMotor;

	@Column(name = "lanhaAcessorios", nullable = false)
	private String lanchaAcessorios;

	@Column(name = "lanchaQuantidadeMotores", nullable = false)
	private String lanchaQuantidadeMotores;

	@Column(name = "lanchaCapacidadeTanque", nullable = false)
	private String lanchaCapacidadeTanque;

	@IndexColumn(name = "lancha_FKIndex1")
	@ForeignKey(name = "lancha_FKIndex1")
	@OneToOne
	@JoinColumn(name = "idEmbarcacao", insertable = true, updatable = true)
	private Embarcacao embarcacao;

	public Integer getIdLancha() {
		return idLancha;
	}

	public void setIdLancha(Integer idLancha) {
		this.idLancha = idLancha;
	}

	public String getLanchaComprimento() {
		return lanchaComprimento;
	}

	public void setLanchaComprimento(String lanchaComprimento) {
		this.lanchaComprimento = lanchaComprimento;
	}

	public String getLanchaPotenciaMotor() {
		return lanchaPotenciaMotor;
	}

	public void setLanchaPotenciaMotor(String lanchaPotenciaMotor) {
		this.lanchaPotenciaMotor = lanchaPotenciaMotor;
	}

	public String getLanchaAno() {
		return lanchaAno;
	}

	public void setLanchaAno(String lanchaAno) {
		this.lanchaAno = lanchaAno;
	}

	public String getLanchaQuantidadePessoas() {
		return lanchaQuantidadePessoas;
	}

	public void setLanchaQuantidadePessoas(String lanchaQuantidadePessoas) {
		this.lanchaQuantidadePessoas = lanchaQuantidadePessoas;
	}

	public String getLanchaModelo() {
		return lanchaModelo;
	}

	public void setLanchaModelo(String lanchaModelo) {
		this.lanchaModelo = lanchaModelo;
	}

	public String getLanchaMarca() {
		return lanchaMarca;
	}

	public void setLanchaMarca(String lanchaMarca) {
		this.lanchaMarca = lanchaMarca;
	}

	public String getLanchaTipoMotor() {
		return lanchaTipoMotor;
	}

	public void setLanchaTipoMotor(String lanchaTipoMotor) {
		this.lanchaTipoMotor = lanchaTipoMotor;
	}

	public String getLanchaAcessorios() {
		return lanchaAcessorios;
	}

	public void setLanchaAcessorios(String lanchaAcessorios) {
		this.lanchaAcessorios = lanchaAcessorios;
	}

	public String getLanchaQuantidadeMotores() {
		return lanchaQuantidadeMotores;
	}

	public void setLanchaQuantidadeMotores(String lanchaQuantidadeMotores) {
		this.lanchaQuantidadeMotores = lanchaQuantidadeMotores;
	}

	public String getLanchaCapacidadeTanque() {
		return lanchaCapacidadeTanque;
	}

	public void setLanchaCapacidadeTanque(String lanchaCapacidadeTanque) {
		this.lanchaCapacidadeTanque = lanchaCapacidadeTanque;
	}

	public Embarcacao getEmbarcacao() {
		return embarcacao;
	}

	public void setEmbarcacao(Embarcacao embarcacao) {
		this.embarcacao = embarcacao;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Lancha() {
		super();
		this.idLancha = null;
		this.lanchaAcessorios = null;
		this.lanchaAno = null;
		this.lanchaCapacidadeTanque = null;
		this.lanchaComprimento = null;
		this.lanchaMarca = null;
		this.lanchaModelo = null;
		this.lanchaPotenciaMotor = null;
		this.lanchaQuantidadeMotores = null;
		this.lanchaQuantidadePessoas = null;
		this.lanchaTipoMotor = null;
		this.setEmbarcacao(new Embarcacao());

	}

	public String toString() {
		return ("{" + super.toString() + "\\" + this.idLancha + "\\"
				+ this.lanchaAcessorios + "\\" + this.lanchaAno + "\\"
				+ this.lanchaCapacidadeTanque + "}" + this.lanchaComprimento
				+ "}" + this.lanchaComprimento + "}" + this.lanchaMarca + "}"
				+ this.lanchaPotenciaMotor + "}" + this.lanchaQuantidadeMotores
				+ "}" + this.lanchaQuantidadePessoas + "}"
				+ this.lanchaTipoMotor + "}");
	}
}

Embarcacao POJO

@Entity
@Table(name = "embarcacao")
@Inheritance(strategy = InheritanceType.JOINED)
//@DiscriminatorColumn(name = "tipoEmbarcacao", discriminatorType = DiscriminatorType.INTEGER)
//@DiscriminatorValue("0")
public class Embarcacao implements Serializable {
	private static final long serialVersionUID = 1L;

	@IndexColumn(name = "idEmbarcacao_UNIQUE")
	@Id
	@Column(name = "idEmbarcacao", nullable = false)
	private Integer idEmbarcacao;

	@Column(name = "nomeEmbarcacao", nullable = false)
	private String nomeEmbarcacao;

	@Column(name = "inscricaoEmbarcacao", nullable = false)
	private String inscricaoEmbarcacao;

	@IndexColumn(name = "embarcacao_FKIndex3")
	@ForeignKey(name = "embarcacao_FKIndex3")
	@ManyToOne
	@JoinColumn(name = "idProprietario", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	public Proprietario proprietario;

	public Embarcacao() {
		this.nomeEmbarcacao = null;
		this.inscricaoEmbarcacao = null;
		this.idEmbarcacao = null;
		this.proprietario = new Proprietario();
	}

	@Override
	public String toString() {
		return "Embarcacao [idEmbarcacao=" + idEmbarcacao + ", nomeEmbarcacao="
				+ nomeEmbarcacao + ", inscricacaoEmbarcacao="
				+ inscricaoEmbarcacao + "]";
	}

	public Integer getIdEmbarcacao() {
		return idEmbarcacao;
	}

	public void setIdEmbarcacao(Integer idEmbarcacao) {
		this.idEmbarcacao = idEmbarcacao;
	}

	public String getNomeEmbarcacao() {
		return nomeEmbarcacao;
	}

	public void setNomeEmbarcacao(String nomeEmbarcacao) {
		this.nomeEmbarcacao = nomeEmbarcacao;
	}

	public String getInscricaoEmbarcacao() {
		return inscricaoEmbarcacao;
	}

	public void setInscricaoEmbarcacao(String inscricaoEmbarcacao) {
		this.inscricaoEmbarcacao = inscricaoEmbarcacao;
	}

	public Proprietario getProprietario() {
		return proprietario;
	}

	public void setProprietario(Proprietario proprietario) {
		this.proprietario = proprietario;
	}

}
wagnerfrancisco

O problema é que você está anotando a classe Pai (Embarcacao) com @Id e as classes filhas (JetSki e Lancha) também.

Use @PrimaryKeyJoinColumn nas classes filhas ao invés de @Id. O parâmetro name do @PrimaryKeyJoinColumn é a chave estrangeira para embarcação.

G

Wagner deu certo, valeu!

Agora so mais uma duvida, estou consesuindo incluir, alterar,listar e execluir, porem quando tendo excluir uma linha que nao existe é para aparecer “Objeto nao existe” porem ele nao esta fazendo essa validaçao, veja minhas classe DAO(HIBERNATE)

@SuppressWarnings("deprecation")
public class ProprietarioHibernate {

	private AnnotationConfiguration ac;
	private SessionFactory factory;
	private Session session;

	public ProprietarioHibernate() {
		ac = new AnnotationConfiguration();
		ac.configure();
		factory = ac.buildSessionFactory();
		session = factory.openSession();
	}

	public void destroy() {
		session.close();
	}

	public boolean inclui(Proprietario registro) throws HibernateException,
			ConstraintViolationException {
		try {
			session.beginTransaction();
			session.save(registro);
			session.getTransaction().commit();
		} catch (ConstraintViolationException e) {
			if (session.getTransaction() != null)
				session.getTransaction().rollback();
			throw new ConstraintViolationException(
					"Falha de inclusão: Objeto já existe.", null,
					"Registro duplicado.");
		} catch (HibernateException e) {
			if (session.getTransaction() != null)
				session.getTransaction().rollback();
			throw new HibernateException("Falha de inclusão no BD: ", e);
		} finally {
			session.close();
		}
		return true;
	}

	public boolean exclui(Proprietario registro) throws HibernateException,
			ObjectNotFoundException {
		try {
			session.beginTransaction();
			session.delete(registro);
			session.getTransaction().commit();
		} catch (ObjectNotFoundException e) {
			if (session.getTransaction() != null)
				session.getTransaction().rollback();
			throw new ObjectNotFoundException(
					"Falha de consulta: Objeto não localizado.",
					"ERRO! Objeto não localizado");
		} catch (HibernateException e) {
			if (session.getTransaction() != null)
				session.getTransaction().rollback();
			throw new HibernateException("Falha de exclusão no BD: ", e);
		} finally {
			session.close();
		}
		return true;
	}

	public boolean altera(Proprietario registro) throws HibernateException,
			ObjectNotFoundException {
		try {
			session.beginTransaction();
			session.update(registro);
			session.getTransaction().commit();
		} catch (StaleStateException e) {
			if (session.getTransaction() != null)
				session.getTransaction().rollback();
			throw new ObjectNotFoundException(
					"Falha de consulta: Objeto não localizado ",
					"ERRO! Objeto não localizado");
		} catch (HibernateException e) {
			if (session.getTransaction() != null)
				session.getTransaction().rollback();
			throw new HibernateException("Falha de alteração no BD: ", e);
		} finally {
			session.close();
		}
		return true;
	}

	public Proprietario consulta(Proprietario registro) throws HibernateException,
			ObjectNotFoundException {
		try {
			registro = (Proprietario) session.get(Proprietario.class,
					registro.getidProprietario());
		} catch (ObjectNotFoundException e) {
			throw new ObjectNotFoundException(
					"Falha de consulta: Objeto não localizado ",
					"ERRO! Objeto não localizado");
		} catch (HibernateException e) {
			throw new HibernateException("Falha de consulta no BD: ", e);
		} finally {
			session.close();
		}
		return registro;
	}

	// Ver Consulta por critério da documentação de referência do Hibernate (cap
	// 17)
	@SuppressWarnings("unchecked")
	public List<Proprietario> listaTudo() throws HibernateException {
		List<Proprietario> listagem;
		try {
			listagem = session.createCriteria(Proprietario.class).list();
		} catch (HibernateException e) {
			throw new HibernateException("Falha de consulta no BD: ", e);
		} finally {
			session.close();
		}
		return listagem;
	}

	// Ver Consulta por critério da documentação de referência do Hibernate (cap
	// 17)
	@SuppressWarnings("unchecked")
	public List<Proprietario> pagina(int inicio, int quantia)
			throws HibernateException {
		List<Proprietario> listagem;
		try {
			listagem = session.createCriteria(Proprietario.class)
					.setMaxResults(quantia).setFirstResult(inicio).list();
		} catch (HibernateException e) {
			throw new HibernateException("Falha de consulta no BD: ", e);
		} finally {
			session.close();
		}
		return listagem;
	}

	// Ver Consulta por critério da documentação de referência do Hibernate (cap
	// 17)
	@SuppressWarnings("unchecked")
	public List<Proprietario> listaLike(String nome)
			throws HibernateException {
		List<Proprietario> listagem;
		try {
			listagem = session
					.createCriteria(Proprietario.class)
					.add(Restrictions
							.like("nome", nome + "%")).list();
		} catch (HibernateException e) {
			throw new HibernateException("Falha de consulta no BD: ", e);
		} finally {
			session.close();
		}
		return listagem;
	}
}

Olha oque aparece no log

Hibernate: 
    /* get current state br.ucb.pojo.Proprietario */ select
        proprietar_.idProprietario,
        proprietar_.cpf as cpf3_,
        proprietar_.numeroArrais as numeroAr3_3_,
        proprietar_.proprietarioNome as propriet4_3_,
        proprietar_.telefone as telefone3_ 
    from
        proprietario proprietar_ 
    where
        proprietar_.idProprietario=?
12:35:28  INFO [DefaultDeleteEventListener] handling transient entity in delete processing
Excluído: Proprietario [idProprietario=10, proprietarioNome=null, numeroArrais=null, cpf=null, telefone=null]

Ela fala que exluii o proprietario de id10, porem nao existe o mesmo no banco.

wagnerfrancisco

Acredito que o método delete não dispare esta exceção. Quem dispara é o load.

Mas numa aplicação normal, normalmente você carrega a entidade antes de deletar, e aí obtem a exceção.

G

Agora estou tentando incluir uma embarcaçao e esta dando o erro:

Exception in thread "main" org.hibernate.HibernateException: Falha de inclusão no BD: 
	at br.ucb.hibernate.EmbarcacaoHibernate.inclui(EmbarcacaoHibernate.java:49)
	at br.ucb.aplicacao.EmbarcacaoController.inclusaoDeEmbarcacao(EmbarcacaoController.java:12)
	at br.ucb.aplicacao.EmbarcacaoController.main(EmbarcacaoController.java:61)
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.ucb.pojo.Proprietario
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:265)
	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
	at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:295)
	at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3403)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:520)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:230)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:154)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	at br.ucb.hibernate.EmbarcacaoHibernate.inclui(EmbarcacaoHibernate.java:39)
wagnerfrancisco

A embarcação referencia um proprietário e o proprietário não foi salvo. Ou vc usa cascade pra salvar automaticamente, ou salva o proprietário antes de salvar a embarcação.

G

Entendi, incluir o proprietario e ta dando o memso erro, minha duvida na classe onde passo o parametros para incluir na tabela embarcacao como devo informar o id que referncia o propreitario:

wagnerfrancisco

Pode colar o código que você está usando para persistir a Embarcacao?

G

Segue

public static void main(String[] args) throws Exception {

		Embarcacao registro = new Embarcacao();
		
		registro.setIdEmbarcacao(1);
		registro.setInscricaoEmbarcacao("IM123458");
		registro.setNomeEmbarcacao("Vida Boa");


        inclusaoDeEmbarcacao(registro);
wagnerfrancisco

No construtor de Embarcacao você está instanciando um novo Proprietario (pelo código que você passou lá em cima). Algum motivo especial para isto?

Um Proprietario normalmente pode ter mais de uma Embarcacao, de modo que você não deveria atrelar o tempo de vida dele ao tempo de vida do objeto Embarcacao. Minha dica é que você não inicialize ele lá. Na aplicação provavelmente tu vai buscar um proprietário do banco e associar à Embarcacao.

G

Isso, minha intençao e fazer como voce sugeriu, o problema e que meu professor da faculdade quer ver rodando as persistencia via console memso, a perssitencia na tabela proprietario esta ok, apenas queria saber como faco para testar a persistencia das tabelas (jetski e ou embarcaccao).

wagnerfrancisco

Mas o problema é o fato de você estar instanciando um novo Proprietario sempre que cria uma Embarcacao. Veja:

public Embarcacao() {
		this.nomeEmbarcacao = null;
		this.inscricaoEmbarcacao = null;
		this.idEmbarcacao = null;
		this.proprietario = new Proprietario(); // o hibernate nao tem como persistir este obj, por isso a TransientObjectException. Nao inicialize proprietario aqui.
	}

Aliás, como mencionei antes, você não precisa de um construtor que atribui nulo pra tudo. É o mesmo que não ter, sugiro que remova este construtor.

Pra você persistir a embarcação com o proprietário, vai fazer algo assim:

Proprietario proprietario = session.load(1); //busca proprietario com id, por exemplo

Embarcacao registro = new Embarcacao();
registro.setInscricaoEmbarcacao("IM123458");
registro.setProprietario(proprietario);
//...

session.save(registro);
G

Nao esta sendo possivel criar Proprietario proprietario = session.load(1); (o session ta dando erro)

wagnerfrancisco

Posta o erro.

G

Vou resumir minha duvida kkkkk, deu que eu faço o insert do proprietario ok, ai vou inserir uma embarcacao que precisa de um proprietario, na minha classe Embarcacao.controller eu faço os inserts a minha duvida e como que eu pego o id do proprietario e inserir na tabela embarcacao como fk.

wagnerfrancisco

Da maneira que eu postei antes não deu certo? O session.load carrega o objeto que você inseriu do banco. Você pode ter outros métodos para buscá-lo (usando outros parâmetros, não o id por exemplo).

Se você acabou de inserir e já quer usá-lo também é possível e não precisa carregar com load:

Proprietario proprietario = new Proprietario();
proprietario.setNome("nome");
//...
session.save(proprietario);

Embarcacao registro = new Embarcacao();
registro.setInscricaoEmbarcacao("IM123458");
registro.setProprietario(proprietario);
//...
session.save(registro);
G

Consegui, o problema que estava encontrando era que eu tinha uam classe que fazia o insert do proprietario e outra classe para inserir a embarcacao, ai na classe embarcacao nao conseguia enxergar o proprietario que criei, ai e coloquei tudo em uma classe so.

Agora outro problema e o seguinte:
Eu estou conseguindo inserir/alterar/listar um proprietario, e tambem estou conseguindo inseir/alterar/consultar uma embarcacao e veincular um proprietario a ela. Seu eu tentar inserir uma embarcacao se nao tiver nenhum proprietario da erro Ok, agora o probelma que esta ocorrendo é o seguinte a aplicacao esta permitindo eu excluir um proprietario mesmo este tando veicinulado aa uma embarcacao, segue as minhas classes alteradas:

Proprietario POJO

@Entity
@Table(name = "proprietario")
public class Proprietario implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "idProprietario", nullable = false)
	private Integer idProprietario;

	@Column(name = "proprietarioNome", nullable = false)
	private String proprietarioNome;

	@Column(name = "numeroArrais", nullable = false)
	private String numeroArrais;

	@Column(name = "cpf", nullable = false)
	private String cpf;

	@Column(name = "telefone", nullable = false)
	private String telefone;

	@OneToMany(mappedBy = "proprietario", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Collection<Embarcacao> embarcacoes;

Embarcacao POJO:

@Entity
@Table(name = "embarcacao")
public class Embarcacao implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "idEmbarcacao", nullable = false)
	private Integer idEmbarcacao;

	@Column(name = "nomeEmbarcacao", nullable = false)
	private String nomeEmbarcacao;

	@Column(name = "inscricaoEmbarcacao", nullable = false)
	private String inscricaoEmbarcacao;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idProprietario", insertable = true, updatable = true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Proprietario proprietario;

Banco de dados:

CREATE TABLE embarcacao (
  idEmbarcacao INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  idProprietario INTEGER UNSIGNED NOT NULL,
  nomeEmbarcacao TEXT NOT NULL,
  inscricaoEmbarcacao TEXT NOT NULL,
  PRIMARY KEY(idEmbarcacao),
  INDEX embarcacao_FKIndex1(idProprietario)
);

CREATE TABLE proprietario (
  idProprietario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  proprietarioNome TEXT NOT NULL,
  numeroArrais TEXT NOT NULL,
  cpf CHAR(11) NOT NULL,
  telefone CHAR(15) NOT NULL,
  PRIMARY KEY(idProprietario)
);

Resumindo como faço para nao deixar a aplicaçao excluir um proprietario que esteje veicunlado a uma embarcacao.

wagnerfrancisco

Você está criando as FK no banco?

G

Sim criei, olha:

CREATE TABLE embarcacao (  
  idEmbarcacao INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,  
  idProprietario INTEGER UNSIGNED NOT NULL,  
  nomeEmbarcacao TEXT NOT NULL,  
  inscricaoEmbarcacao TEXT NOT NULL,  
  PRIMARY KEY(idEmbarcacao),  
  INDEX embarcacao_FKIndex1(idProprietario)  
);
wagnerfrancisco

Eu digo uma Foreign Key

Uma maneira simples de criar:

CREATE TABLE embarcacao (  
  idEmbarcacao INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,  
  idProprietario INTEGER UNSIGNED NOT NULL references proprietario (idProprietario),  
  nomeEmbarcacao TEXT NOT NULL,  
  inscricaoEmbarcacao TEXT NOT NULL,  
  PRIMARY KEY(idEmbarcacao),  
  INDEX embarcacao_FKIndex1(idProprietario)  
);
G

Sabe o porque desse erro:

01:41:51  INFO [Version             ] Hibernate Commons Annotations 3.2.0.Final
01:41:51  INFO [Environment         ] Hibernate 3.6.5.Final
01:41:51  INFO [Environment         ] hibernate.properties not found
01:41:51  INFO [Environment         ] Bytecode provider name : javassist
01:41:51  INFO [Environment         ] using JDK 1.4 java.sql.Timestamp handling
01:41:52  INFO [Configuration       ] configuring from resource: /hibernate.cfg.xml
01:41:52  INFO [Configuration       ] Configuration resource: /hibernate.cfg.xml
01:41:52  WARN [DTDEntityResolver   ] recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
01:41:52  INFO [Configuration       ] Configured SessionFactory: null
01:41:52  INFO [AnnotationBinder    ] Binding entity from annotated class: br.ucb.pojo.Embarcacao
01:41:52  INFO [EntityBinder        ] Bind entity br.ucb.pojo.Embarcacao on table embarcacao
01:41:53  INFO [AnnotationBinder    ] Binding entity from annotated class: br.ucb.pojo.JetSki
Exception in thread "main" java.lang.ClassCastException: org.hibernate.mapping.SingleTableSubclass cannot be cast to org.hibernate.mapping.RootClass
	at org.hibernate.cfg.annotations.PropertyBinder.bind(PropertyBinder.java:209)
	at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:200)
	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2061)
	at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:796)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035)
	at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1398)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1856)
	at br.ucb.hibernate.EmbarcacaoHibernate.<init>(EmbarcacaoHibernate.java:26)
	at br.ucb.aplicacao.TesteEmbProp.inclusaoDeEmbarcacao(TesteEmbProp.java:59)
	at br.ucb.aplicacao.TesteEmbProp.main(TesteEmbProp.java:166)
wagnerfrancisco

Pode postar o código que tu usou pra gerar este erro?

E como ficou o mapeamento final das classes…

Pelo que vi isto pode ocorrer quando você tem uma classe pai que não declara um @Id e classes filhas que declaram (o correto seria declarar na classe pai).

G

Wagner fiz algumas alteraçoes e agora falta pouco para resolver, segue o erro:

Hibernate: 
    /* get current state br.ucb.pojo.Proprietario */ select
        proprietar_.idProprietario,
        proprietar_.cpf as cpf3_,
        proprietar_.numeroArrais as numeroAr3_3_,
        proprietar_.proprietarioNome as propriet4_3_,
        proprietar_.telefone as telefone3_ 
    from
        proprietario proprietar_ 
    where
        proprietar_.idProprietario=?
Hibernate: 
    /* insert br.ucb.pojo.Proprietario
        */ insert 
        into
            proprietario
            (cpf, numeroArrais, proprietarioNome, telefone, idProprietario) 
        values
            (?, ?, ?, ?, ?)
Hibernate: 
    /* insert br.ucb.pojo.JetSki
        */ insert 
        into
            embarcacao
            (inscricaoEmbarcacao, nomeEmbarcacao, idProprietario) 
        values
            (?, ?, ?)
Hibernate: 
    /* insert br.ucb.pojo.JetSki
        */ insert 
        into
            jetski
            (embarcacao_idEmbarcacao, idJetski, jetAno, jetComprimento, jetMarca, jetModelo, jetPotenciaMotor, jetQuantidadePessoas, jetTipoMotor, idEmbarcacao) 
        values
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
21:25:12  WARN [JDBCExceptionReporter] SQL Error: 1054, SQLState: 42S22
21:25:12 ERROR [JDBCExceptionReporter] Unknown column 'jetComprimento' in 'field list'
Exception in thread "main" org.hibernate.HibernateException: Falha de inclusão no BD: 
	at br.ucb.hibernate.JetSkiHibernate.inclui(JetSkiHibernate.java:49)
	at br.ucb.aplicacao.TesteEmbProp.inclusaoDeJetSki(TesteEmbProp.java:104)
	at br.ucb.aplicacao.TesteEmbProp.main(TesteEmbProp.java:190)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [br.ucb.pojo.JetSki]
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2454)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2854)
	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
	at br.ucb.hibernate.JetSkiHibernate.inclui(JetSkiHibernate.java:38)
	... 2 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'jetComprimento' in 'field list'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2444)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2347)
	at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2437)
	... 17 more

Minhas classes:

Embarcacao Pojo:

@Entity
@Table(name = "embarcacao")
@Inheritance(strategy = InheritanceType.JOINED)
public class Embarcacao implements Serializable {
	// private static final long serialVersionUID = 1L;

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "idEmbarcacao", unique = true, nullable = false)
	private Integer idEmbarcacao;

	@Column(name = "nomeEmbarcacao", nullable = false)
	private String nomeEmbarcacao;

	@Column(name = "inscricaoEmbarcacao", nullable = false)
	private String inscricaoEmbarcacao;

Jetski Pojo:

@Entity
@Table(name = "jetski")
@PrimaryKeyJoinColumn(name = "idEmbarcacao")
public class JetSki extends Embarcacao {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "embarcacao_idEmbarcacao")
	private Embarcacao embarcacao;

	private Integer idJetski;

	@Column(name = "jetComprimento", nullable = false)
	private String jetComprimento;

	@Column(name = "jetPotenciaMotor", nullable = false)
	private String jetPotenciaMotor;

	@Column(name = "jetAno", nullable = false)
	private String jetAno;

	@Column(name = "jetQuantidadePessoas", nullable = false)
	private String jetQuantidadePessoas;

	@Column(name = "jetModelo", nullable = false)
	private String jetModelo;

	@Column(name = "jetMarca", nullable = false)
	private String jetMarca;

	@Column(name = "jetTipoMotor", nullable = false)
	private String jetTipoMotor;

Segue como estou inserindo:

Proprietario proprietario1 = new Proprietario();
		Embarcacao registro = new Embarcacao();
		JetSki jetski1 = new JetSki();

		proprietario1.setidProprietario(2);
		proprietario1.setproprietarioNome("Gustavo");
		proprietario1.setArrais("1256897");
		proprietario1.setCpf("[telefone removido]");
		proprietario1.setTelefone("061-92312943");

jetski1.setnomeEmbarcacao("Vida Boa");
		jetski1.setinscricaoEmbarcacao("Im5555");
		jetski1.setProprietario(proprietario1);
		jetski1.setJetAno("2010");
		jetski1.setJetComprimento("2,50 m");
		jetski1.setJetMarca("Susuki");
		jetski1.setJetModelo("ix150");
		jetski1.setJetPotenciaMotor("750 cc");
		jetski1.setJetQuantidadePessoas("2");
		jetski1.setJetTipoMotor("2 Tempos");
wagnerfrancisco

A exceção tá dizendo que não tem a coluna jetComprimento na tabela jetski…

G

Wagner,

Consegui inserir uma embarcacao, porem qunado vou inserir um jetski, da o erro:

Exception in thread "main" org.hibernate.HibernateException: Falha de inclusão no BD: 
	at br.ucb.hibernate.JetSkiHibernate.inclui(JetSkiHibernate.java:49)
	at br.ucb.aplicacao.TesteEmbProp.inclusaoDeJetSki(TesteEmbProp.java:104)
	at br.ucb.aplicacao.TesteEmbProp.main(TesteEmbProp.java:184)
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: br.ucb.pojo.JetSki.inscricaoEmbarcacao
	at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:312)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
	at br.ucb.hibernate.JetSkiHibernate.inclui(JetSkiHibernate.java:38)
G

Prezados,

Estou conseguindo inserir em todas as tabelas, porem minha duvida é:

Se eu tentar inserir da seguinte forma:

JetSki jetski1 = new JetSki();

		jetski1.setidEmbarcacao(1);
		jetski1.setinscricaoEmbarcacao("IM333116");
		jetski1.setnomeEmbarcacao("Bodas de ouro");
		jetski1.setProprietario(proprietario1);
		jetski1.setJetAno("2010");
		jetski1.setJetComprimento("2,50 m");
		jetski1.setJetMarca("Susuki");
		jetski1.setJetModelo("ix150");
		jetski1.setJetPotenciaMotor("750 cc");
		jetski1.setJetQuantidadePessoas("2");
		jetski1.setJetTipoMotor("2 Tempos");

Da o seguinte erro:

Exception in thread "main" org.hibernate.HibernateException: Falha de inclusão no BD: 
	at br.ucb.hibernate.JetSkiHibernate.inclui(JetSkiHibernate.java:49)
	at br.ucb.aplicacao.TesteEmbProp.inclusaoDeJetSki(TesteEmbProp.java:106)
	at br.ucb.aplicacao.TesteEmbProp.main(TesteEmbProp.java:232)
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.ucb.pojo.Embarcacao
	at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:265)
	at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
	at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:295)
	at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3403)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:520)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:230)
	at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:154)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
	at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	at br.ucb.hibernate.JetSkiHibernate.inclui(JetSkiHibernate.java:39)

Mas se eu inserir da seguinte forma:

Embarcacao registro = new Embarcacao();

		registro.setidEmbarcacao(1);
		registro.setinscricaoEmbarcacao("IM333116");
		registro.setnomeEmbarcacao("Bodas de ouro");
		registro.setProprietario(proprietario1);

JetSki jetski1 = new JetSki();

		jetski1.setidEmbarcacao(1);
		jetski1.setinscricaoEmbarcacao("IM333116");
		jetski1.setnomeEmbarcacao("Bodas de ouro");
		jetski1.setProprietario(proprietario1);
		jetski1.setEmbarcacao(registro);
		jetski1.setJetAno("2010");
		jetski1.setJetComprimento("2,50 m");
		jetski1.setJetMarca("Susuki");
		jetski1.setJetModelo("ix150");
		jetski1.setJetPotenciaMotor("750 cc");
		jetski1.setJetQuantidadePessoas("2");
		jetski1.setJetTipoMotor("2 Tempos");

Da certo, porem a tabela embarcacao fica com dois registros.

Qual o jito certo de fazer esse insert.

G

Erro agora

Exception in thread "main" org.hibernate.HibernateException: Falha de inclusão no BD: at br.ucb.hibernate.LanchaHibernate.inclui(LanchaHibernate.java:49) at br.ucb.aplicacao.TesteController.inclusaoDeLancha(TesteController.java:146) at br.ucb.aplicacao.TesteController.main(TesteController.java:251) Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.ucb.pojo.Embarcacao at org.hibernate.id.Assigned.generate(Assigned.java:53) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:713) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697) at br.ucb.hibernate.LanchaHibernate.inclui(LanchaHibernate.java:38)

Criado 24 de agosto de 2012
Ultima resposta 30 de ago. de 2012
Respostas 28
Participantes 2