Relacionamento UniDirecional

2 respostas
cristianovieira

Olá boa noite venho por meio deste mais uma vez pedir auxilio aos Srs. dessa vez fiquei presso em um relacionamento unidirecional, estou conseguindo salvar normal mas na hora de trazer ele traz um persistencebag então segue o cenário:

Classe Pedido tem varias Contas - Esse relacionamento é Unidirecinoal, ou seja, Contas não se relaciona com pedido, levando isso em conta

Classe Pedido

@Entity
@Table(name="pedido", schema="public")
public class Pedido {

	@Id
	@SequenceGenerator(name="generator_pedido", sequenceName="gen_pedido")
    @GeneratedValue(generator="generator_pedido")
 	@Column(name="pedi_id", nullable=false)
	private int pedi_id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="pess_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
	private Pessoa pessoa;

    @Column(name="pedi_tipo", length=50, nullable=false)
    private int pedi_tipo;

    @OneToMany(mappedBy="pedido")
    @Cascade(CascadeType.ALL)
    private List<ItemPedido> itempedido;

    @Column(name="pedi_dtemissao", nullable=false)
    @Temporal(TemporalType.DATE)
    private Date pedi_dtemissao;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="usua_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Usuario usuario;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="empe_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Empresa empresa;

    @OneToMany()
    @Cascade(value={CascadeType.ALL})
    @JoinTable(name = "pedido_conta", joinColumns = @JoinColumn(name = "pedi_id"), inverseJoinColumns = @JoinColumn(name = "cota_id"))
    private List<Conta> conta;

    @OneToMany(mappedBy="pedido")
    @Cascade(CascadeType.ALL)
    private List<Pedido_conta> pedido_conta;

Classe Conta

@Entity
@Table(name="conta", schema="public")
public class Conta {

	@Id
	@SequenceGenerator(name="generator_conta", sequenceName="gen_conta")
    @GeneratedValue(generator="generator_conta")
 	@Column(name="cota_id", nullable=false)
	private int cota_id;

    @Column(name="cota_tipo", length=1, nullable=false)
	private int cota_tipo;

    @Column(name="cota_dtlancamento", nullable=false)
    @Temporal(TemporalType.DATE)
    private Date cota_dtlancamento;

    @Column(name="cota_dtvencimento", nullable=false)
    @Temporal(TemporalType.DATE)
    private Date cota_dtvencimento;

    @Column(name="cota_valor", precision=2, nullable=false)
    private Double cota_valor;

    @Column(name="cota_status", length=1, nullable=false)
    private int cota_status;

    @OneToMany(mappedBy="conta")
    @Cascade(CascadeType.ALL)
    private List<ContaAnotacao> contaanotacao;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="coca_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private ContaCaixa contacaixa;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="pess_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Pessoa pessoa;

    @Column(name="cota_descricao", length=200, nullable=true)
    private String cota_descricao;

    @Column(name="cota_parcela", length=15, nullable=false)
    private String cota_parcela;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="usua_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
	private Usuario usuario;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="empe_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Empresa empresa;
@Entity
@Table(name="pedido_conta", schema="public")
public class Pedido_conta implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="pedi_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
	private Pedido pedido;

    @Id
    @OneToOne()
    private Conta conta;

Bom a minha duvida é a seguinte, quando eu faço alguma alteração no pedido eu preciso deletar todas as contas, mas contas não tem relação com pedido então preciso recuperar todas as contas para poder envialas a deleção na classe de persistencia de conta, para isso resolvi mapear a tabela pedido_conta a classe Pedido_conta no intuito de obter todas as contas de 1 pedido, ok… quando eu procuro pelo pedido ele vem com o atributo pedido_conta como persistencebag e quando eu clico pra ver se ele vai conseguir obter os itens é gerado o seguinte erro “ERRO: coluna pedido_con0_.conta_cota_id não existe” a ideia é criar o controlador de pedido_conta e passar um pedido para ele retornar uma listagem de conta sendo assim vou conseguir ter o total controle das contas geradas pelo pedido.

PS1: Gets and Seters foram omitidos.
PS2: Não estou utilizando o filter do hibernate para manter a sessão aberta, estou implementando tudo na mão mesmo afim de performance
PS3: Não é uma sugestão válida colocar o fatch para eager preciso mesmo

Estive dando uma analisada enquanto postava aqui, e vi essa 3º constraint fruto do relacionamento unidirecional, tentei o seguinte:
1º Remover o relacionamento de Pedido com PedidoConta e deixar como se fosse uma classe normal
2º Remover essa 3º constraint na mão no banco pra ver se o tal erro desaparecia e eu conseguia obter a listagem de pedidos e de contas com a classe PedidoConta

Ambos não resolveram, segue abaixo o script do postgres da tabela gerada automaticamente.

CREATE TABLE pedidoconta
(
  pedi_id integer NOT NULL,
  cota_id integer NOT NULL,
  CONSTRAINT fk781ee34a9c190dbf FOREIGN KEY (cota_id)
      REFERENCES conta (cota_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk781ee34aec0de856 FOREIGN KEY (pedi_id)
      REFERENCES pedido (pedi_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT pedidoconta_cota_id_key UNIQUE (cota_id)
)

Nâo sei mais o que fazer.
Fico no aguardo.

2 Respostas

Hebert_Coelho

Cara, não entendi seu problema. Sério mesmo.

Seu problema é esse? estou conseguindo salvar normal mas na hora de trazer ele traz um persistencebag
Ou é na hora de deletar as classes que não tem vínculo com a outra? Tem alguma mensagem de erro sem ser aquela de quando vocÊ tentou colocar a tabela intermediária?

cristianovieira

Obrigado por responder, o meu problema estava situado na hora de obter as contas do pedido, levando em consideração que é um relacionamento unidirecional, precisava obter as contas para poder deleta-las, então tive que mapear a classe PedidoConta e sinceramente fui tomar banho pensando nisso e vi que o relacionamento de pedidoconta com conta não é OneToOne e sim OneToMany assim como PedidoConta para Pedido, então mudei o relacionamento e ja era… fucionou 100%.

De qualquer forma obrigado por responder.

Vlwww

Criado 1 de junho de 2012
Ultima resposta 1 de jun. de 2012
Respostas 2
Participantes 2