[RESOLVIDO]Dificuldade em adicionar cadastro no Hibernate com relacionamento

2 respostas
skekeu

Opa galera, tudo blz?

Estou penando pra conseguir resolver um probleminha aqui e decidi pedir ajuda à vcs. :D
Como sou iniciante em hibernate (e no resto tbm :lol: ) ... não estou conseguindo achar a solução

É o seguinte:

Preciso cadastrar um documento no banco de dados. Esse documento tem um Cliente (fk), porém pode ou não ter um Navio(fk).
Ambos, o cliente e o navio, já estarão cadastrados previamente na base de dados.

O problema é: quando cadastro um documento que tem navio tudo ocorre bem, mas se tento cadastrar um documento sem navio recebo a excessão:

object references an unsaved transient instance - save the transient instance before flushing: modelo.Navio

Pesquisando, descobri que teria que salvar minha classe Navio antes de Salvar o documento .... Porém ao fazer o documento é criado, mas também é criado um novo navio em branco na base de dados ...

Como fazer pra não ocorrer a criação desse registro em branco???

Segue minhas classes e o metodo para cadastrar o documento:

Classe do Documento
@Entity()
@Table(name="controle_documentos_empresa")
public class ControleDocumentosEmpresa extends org.apache.struts.action.ActionForm implements Serializable {
    
private static final long serialVersionUID = 1L; 

    public ControleDocumentosEmpresa(){
    ConvertUtils.register(new ConversorData(), Date.class);
    }
    
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int controle_cod;
@Column()
@Temporal(javax.persistence.TemporalType.DATE)
private Date data_emissao;
@Column()
@Temporal(javax.persistence.TemporalType.DATE)
private Date data_validade;
@Column()
@Version
private Timestamp update_em;
@Column()
private String update_por;
@Column()
private String comentarios;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="cliente_cod", nullable=true)
@Fetch(FetchMode.JOIN)
private Cliente cliente = new Cliente();


@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="reparticao_cod")
@Fetch(FetchMode.JOIN)
private Reparticao reparticao = new Reparticao();

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="doc_cod")
@Fetch(FetchMode.JOIN)
private Doc doc = new Doc();


@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="cod", referencedColumnName="cod", nullable=true)
@Fetch(FetchMode.JOIN)
private Navio navio = new Navio();

//getters e setters
Classe Navio
@Entity()
@Table(name="navio")
public class Navio extends org.apache.struts.action.ActionForm implements Serializable {
    
    private static final long serialVersionUID = 1L; 
    
@Id
@GeneratedValue()
@Column(name="cod")
private int cod;
@Column()
private String nome;
@Column(unique=true)
private String imo;
@Column()
private String bandeira;
@Column()
private String numeroegistro;
@Column()
private String inscricaocp;
@Column()
private String portoregistro;
@Column()
private String licconstrucao;
@Column()
private String classeembarcacao;
@Column()
private String tipoembarcacao;
@Column()
private String irin;
@Column()
private String classificadora;
@Column()
private String comprimento;
@Column()
private String  boca;
@Column()
private String pontal;
@Column()
private String calado;
@Column()
private String ab;
@Column()
private String al;
@Column()
private String tpb;
@Column()
private String construtor;
@Column()
private String batquilha;
@Column()
private String entradaeaceitacao;
@Column()
private String materialconstrucao;
@Column()
private String combustivel;
@Column()
private String propulsao;
@Column()
private String motores;
@Column()
private String potenciamotores;
@Column()
private String fabricantemotor;
@Column()
private String fretador;
@Column()
private String afretador;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="cliente_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Cliente cliente = new Cliente();


@OneToMany(mappedBy="navio", fetch=FetchType.LAZY)
private List<ControleDocumentosEmpresa> controle;

//getters e setters
Classe Cliente
@Entity()
@Table(name="cliente")

public class Cliente extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L; 

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column()
   private int cliente_cod;
  @Column() 
   private String razao;
   @Column(unique=true)
   private String cnpj;
   @Column()
   private String tel1;
   @Column()
   private String tel2;
   @Column()
   private String fax;
   @Column()
   private String email;
   @Column()
   private String logadouro;
   @Column()
   private int numero;
   @Column()
   private String bairro;
   @Column()
   private String complemento;
   @Column()
   private String cidade;
   @Column()
   private String estado;
   @Column()
   private String cep;
   @OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)
    private List<Navio> navio;
   
 @OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)   
 private List<ControleDocumentosEmpresa> controle;

//getters e setters
Metodo para cadastrar o documento
public void novoControle(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
session.save(controle.getNavio());
session.save(controle);
transaction.commit();
session.flush();
}

Gente agradeceria muito se alguem me ajudasse a resolver esse problema

2 Respostas

thiagocg

Olá skekeu, tente mudar o mapeamento de Navio da sua classe Documento para:

@ManyToOne @JoinColumn(name="cod", referencedColumnName="cod", nullable=true) private Navio navio;
[]'s

skekeu

thiagocg … funcionou cara …
Valew mesmo a ajuda.

Um abraço 8)

Criado 17 de março de 2010
Ultima resposta 17 de mar. de 2010
Respostas 2
Participantes 2