[RESOLVIDO]Dificuldade em adicionar cadastro no Hibernate com relacionamento

Opa galera, tudo blz?

Estou penando pra conseguir resolver um probleminha aqui e decidi pedir ajuda à vcs. :smiley:
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

[code]@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[/code]

Classe Navio

[code]@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 controle;

//getters e setters[/code]

Classe Cliente
[code]@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;

@OneToMany(mappedBy=“cliente”, fetch=FetchType.LAZY)
private List controle;

//getters e setters[/code]

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

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

thiagocg … funcionou cara …
Valew mesmo a ajuda.

Um abraço 8)