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