Hibernate OneToMany Unidirecional

Boa tarde Galera…

Seguinte to com um probleminha aqui com um relacionamento OneToMany Unidirecional
O problema é o seguinte

Tenho a Classe pessoa

public class Pessoa implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@SequenceGenerator(name="genPessoa", sequenceName="genPessoa", initialValue=1)
	@GeneratedValue(generator="genPessoa", strategy=GenerationType.AUTO)
	private Integer cod;
	private String nome;
	private String telefone;
	private String celular;
	private String fax;
	private Boolean rural;
	private String email;
	
    private Boolean fornecedor;
    private Boolean cliente;
    
	@OneToMany(cascade=CascadeType.ALL)
	@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@JoinColumn(name="pessoaCod_fk")
    private List<Endereco> enderecos;

E a Classe Endereco

public class Endereco implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@SequenceGenerator(name="genEndereco", sequenceName="genEndereco", initialValue=1)
	@GeneratedValue(generator="genEndereco", strategy=GenerationType.AUTO)
	private Integer cod;
	
	private String endereco;
	private String numero;
	private String complemento;
	private String cep;
	private String bairro;
	
    @ManyToOne
    @JoinColumn(name="cidadeCod_fk")
	private Municipio cidade;
    
    @Column(name="tipoEndereco")
    @Enumerated(EnumType.STRING)
    private EnderecoType tipoEndereco;

O problema vem na hora de deletar um Endereço visto que dentro de pessoa possui uma lista de endereços.

Exemplo

Tenho a PessoaX que tem Dois enderecos Endereco_Entrega e Endereco_Cobranca

Dai preciso deletar o Endereco_Cobranca ai faço o seginte

pessoa.getEndereos().remove(0);

E mando dar um update em Pessoa. Aique o hibernate pira heheh
Ao inves de deletar o endereco do banco ele faz um update em endereço removendo o id da pessoa da tabela.
O registro não aparece mais na tela nem nas buscas porém fica um registro perdido dentro do banco.

Alguém ja passou por isso ou tem alguma ideia de como resolver isto

faz um teste só pra ver o que acontece:

Faça ele ficar bi-direcional e veja se ele deleta, mas faça dessa maneira:

Classe endereço:

@ManyToOne(mappedBy="enderecos") private Pessoa pessoa;

Se der pau dessa maneira, tente dessa, alterando a associação:

Classe Pessoa:

@OneToMany(mappedBy="pessoa") @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List<Endereco> enderecos;

Classe Endereco

@ManyToOne @JoinColumn(name="cidadeCod_fk", referencedColumnName="cod") private Pessoa pessoa;

Eu ví que tu colocou o DELETE_ORPHAN e que já deveria funcionar, sinceramente não sei por que não está. Me surgiu a dúvida se delete orphan funciona com unidirecionais ou não.

EDIT: dei ula googleada e é isso mesmo

É uma questão de filosofia rsrs

O delete_orphan, como o próprio nome diz, “deleta o orfão”. Obviamente que um órfão não tem pai, mas “ele já teve” certo? E nesse caso, como você não mapeou quem é o pai e quem é o filho, não haverá “orfão” pra ser deletado.

Unidirecionalmente, tu tá dizendo que o Endereço pode existir sem uma pessoa, ou seja, é uma agregação. Pelo menos eu to vendo que no banco tá certo. O problema tá só nos mapeamentos.

Bom eu acho que é isso, se não der certo vou voltar a estudar java heuiahoeiua

Obrigado pela Dica Leo.

Dessa forma que tu falou funciona.
Mas acabei de descobrir que estou com um problema com o Flex.

Estou fazendo integração entre java e Flex.

Vou ter que estudar muita coisa ainda para arrumar essa arquitetura.

Mais uma vez obrigado pela sua atenção

Bom Estou de volta aqui pelo seguinte

Fiz Varios teste só com java puro e tenho o seguinte problema.
E isso eu creio que ocorra pela maneira que eu carrego os dados…

Primeiro eu carrego a pessoa separada do Endereço vejam como eu to carregando as entitys

Pessoa

[code]
@Override
public Pessoa loadById(Pessoa pessoa) throws Exception {
super.hasObjectClass();
super.hasSession();

	Criteria c = super.session.createCriteria(pessoa.getClass(),"pes")
		.add(Restrictions.sqlRestriction("cod = "+ pessoa.getCod()));
	
	c.setProjection(HibernateUtil.addProjections(
								HibernateUtil.getProjection(Pessoa.class, "pes"), 
								pessoa.getClass(), "pes", false));
	
	c.setResultTransformer(new InteligentResultTransformer(pessoa.getClass()));
	
	return (Pessoa) c.uniqueResult();

}[/code]

Endereço

	@Override
	public List<Endereco> loadByPessoaCod(Serializable cod) throws Exception {
		super.hasSession();
		super.hasObjectClass();
		
		Criteria c = super.session.createCriteria(super.objClass,"end")
			.add(Restrictions.sqlRestriction("pessoaCod_Fk = "+ cod));
		
		c.setProjection(HibernateUtil.getProjection(super.objClass, "end"));
		
		c.setResultTransformer(new InteligentResultTransformer(super.objClass));
		
		return c.list();
	}

E no service é onde eu junto tudo…

public Pessoa byCod(Pessoa other)throws Exception{
		Pessoa pessoa = pessoaDao.loadById(other);
		pessoa.setEnderecos(enderecoDao.loadByPessoaCod(pessoa.getCod()));
		
		pessoa.getEnderecos().remove(0);
		update(pessoa);
		
		return pessoa;
	}

Quando eu faço um update. Ele simplesmente não deleta o endereço que eu removi ele faz um update no mesmo sómente atualizando o cod da pessoa para o cod que ja estava…

Alguém tem alguma ideia… Não posso deixar o hibernate carregar as coisas com lazy e também assim só estou carregando o que eu preciso para tratar na tela.

Ué por que tu não pode deixar o lazy load funcionar?!

Por causo do Flex

Eles não se acertam heheheh.

A questão é que o flez até carrega os dados para view agora quando vai fazer o getEnderecos por exemplo ele da um LazyException pois a session ja vai estar fechada…

[quote=fabianofrizzo]Por causo do Flex

Eles não se acertam heheheh.

A questão é que o flez até carrega os dados para view agora quando vai fazer o getEnderecos por exemplo ele da um LazyException pois a session ja vai estar fechada…[/quote]

Se rolar essa exception, tu pode pegar um OpenSessionInViewFilter ou forçar a inicialização das coleções lazy se tu declarar um método como transacional.

Eu acho que o OpenSessionInViewFilter muita gambiarra.
E será que ficaria legal forçar os lazy será que não ficaria muito carregado o sistema.

[quote=fabianofrizzo]Eu acho que o OpenSessionInViewFilter muita gambiarra.
E será que ficaria legal forçar os lazy será que não ficaria muito carregado o sistema.[/quote]

Na minha opinião, comunicação com Flex “bonita” é sem usar AMF. Pelo visto tu dá usando isso.

O ideal é trabalhar com negócio orientado a serviços, trabalhar com REST ou Web-services, trocar dados via XML ou JSON etc.

Eu já usei (e ainda uso) Flex + Rails e de fato acho mais simples trabalhar com esse tipo de comunicação.

Hum Entendi Leo

É hoje uso o AMF com o GraniteDS.
Mas me diz uma coisa trabalhar com REST ou WEB-Services não é um tanto trabalhoso.

Apesar que trabalhar com o AMF também esta sendo bem trabalhaso. E Chato gastando bastante tempo.

Mais uma vez obrigado pela atenção

[quote=fabianofrizzo]Eu acho que o OpenSessionInViewFilter muita gambiarra.
E será que ficaria legal forçar os lazy será que não ficaria muito carregado o sistema.[/quote]
Gambiarra é ficar trabalhando com lazy=false sendo que você não precisa disso, e sim vai precisar apenas de um atributo ou outro.

[quote=fabianofrizzo]Hum Entendi Leo

É hoje uso o AMF com o GraniteDS.
Mas me diz uma coisa trabalhar com REST ou WEB-Services não é um tanto trabalhoso.

Apesar que trabalhar com o AMF também esta sendo bem trabalhaso. E Chato gastando bastante tempo.

Mais uma vez obrigado pela atenção[/quote]

É que na verdade, o Flex facilita muito o trabalho de XML e JSON, não sei se tu já lidou com isso, mas qualquer coisa tu pode brincar com Rails mesmo :stuck_out_tongue:

O ruim é que trabalhar EM JAVA com JSON e XML é um pouco trabalhoso e chato. O que tu pode fazer é criar os teus próprios Marshallers e mandar pro Flex. Ou também, utilizar os próprios marshallers que existem por aí, como XMLObject, Castor etc.

Mas há maneiras que tu pode deixar o negócio bem mais legal, por exemplo, usando o Spring MVC. Ele facilita muito a criação de operações REST.