Persistencia com Hibernate

3 respostas
G

Prezados, estou desenvolvendo uma simples aplicaçao, dessa forma:

Tenho uma classe Embarcaçao (classe pai), uma classe JetSki (Classe filha), segue o codigo delas:

Embarcaçao Pojo

@Entity
@Table(name = "embarcacao")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@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 = "FK_PROPRIETARIO")
	@ForeignKey(name = "FK_PROPRIETARIO")
	@ManyToOne
	@JoinColumn(name = "idProprietario")
	@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 + ", proprietario=" + proprietario + "]";
	}

	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;
	}

}

JetSki POJO

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

	@PrimaryKeyJoinColumn(name = "idJetski")
	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 = "FK2_EMBARCACAO")
	@ForeignKey(name = "FK2_EMBARCACAO")
	@OneToOne
	@JoinColumn(name = "idEmbarcacao")
	@Fetch(FetchMode.JOIN)
	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 + "}");
	}
}

Minha classe de teste Embarcaçao:

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

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


        inclusaoDeEmbarcacao(registro);

Minha classe de teste jetski:

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

		JetSki registro = new JetSki();
		
		
		registro.setidJetski(1);
		registro.setJetAno("2010");
		registro.setJetComprimento("2,50 m");
		registro.setJetMarca("Susuki");
		registro.setJetModelo("ix150");
		registro.setJetPotenciaMotor("750 cc");
		registro.setJetQuantidadePessoas("2");
		registro.setJetTipoMotor("2 Tempos");

Porem quando compilo a classe embarcaçao sa o seguinte 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:13)
	at br.ucb.aplicacao.EmbarcacaoController.main(EmbarcacaoController.java:62)
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)

E quando tento compilar a classe 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.JetSkiController.inclusaoDeJetSki(JetSkiController.java:12)
	at br.ucb.aplicacao.JetSkiController.main(JetSkiController.java:68)
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.JetSkiHibernate.inclui(JetSkiHibernate.java:38)

Preciso de ajuda para resolver esse problema.

Segue meu banco:

CREATE TABLE embarcacao (
  idEmbarcacao INTEGER UNSIGNED NOT NULL,
  proprietario_idProprietario INTEGER UNSIGNED NOT NULL,
  nomeEmbarcacao TEXT NOT NULL,
  inscricaoEmbarcacao TEXT NOT NULL,
  PRIMARY KEY(idEmbarcacao),
  INDEX FK_PROPRIETARIO(proprietario_idProprietario)
);

CREATE TABLE jetski (
  idJetski INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  embarcacao_idEmbarcacao INTEGER UNSIGNED NOT NULL,
  jetskiComprimento VARCHAR(10) NULL,
  jetPotenciaMotor VARCHAR(10) NULL,
  jetAno VARCHAR(10) NULL,
  jetQuantidadePessoas CHAR(6) NULL,
  jetModelo TEXT NULL,
  jetMarca TEXT NULL,
  jetTipoMotor TEXT NULL,
  PRIMARY KEY(idJetski),
  INDEX FK2_EMBARCACAO(embarcacao_idEmbarcacao)
);

3 Respostas

ErickRAR

proprietario_idProprietario está como NOT NULL. Nesse caso, você precisa definir um 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:

ErickRAR

Você pode primeiro criar um proprietário, salvar no banco e depois referencia-lo na embarcação, ou então utilizar cascade no seu mapeamento, assim, basta preencher o proprietario e depois coloca-lo em embarcação, sem salvar. Quando salvar embarcação, o banco irá salvar o proprietário junto.
Acho a primeira solução melhor, mas você decide.

Criado 25 de agosto de 2012
Ultima resposta 26 de ago. de 2012
Respostas 3
Participantes 2