Hibernate: Mapeamento

7 respostas
Wanderley2k

Pessoal,

Estou tentando fazer um mapeamento no hibernate e não está saindo. Vamos lá:

Tablela: BFJ com id chvbfj e outros campos.
Tabela: CLI com id chvcli e outros campos, esta tabela possue um campo chvbfj que indica um relacionamento com BFJ.

cli.java

...
	@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
	@JoinColumn(name = "chvbfj")
	public Bfj getBfj() {
		return bfj;
	}
...

Como não estou conseguindo fazer o mapeamento, pelo fato da tabela BFJ não ter um campo apontando para CLI eu fiz ela assim:

bfj.java

...
@Transient
	public Cli getCli() throws HibernateException, Exception {
		if (this.cli == null) {
			this.cli = (Cli) (new Dao<Cli>(Cli.class)).createCriteria().add(
					Restrictions.eq("bfj.chvbfj", this.chvbfj)).uniqueResult();
		}
		return cli;
	}
...

Isso ae está porco demais! =) Gostaria de saber se alguém sabe como melhorar isso, ou se tem jeito de dizer ao hibernate que um certo atributo é resultado de uma pesquisa. Se isso for possível, eu tiro este código e coloco uma tag com uma HSQL.

PS. Já andei lendo na documentação da annotation, e não encontrei nada sobre fazer um atributo ser resultado de uma HSQL.

Grato pela atenção,

7 Respostas

Wanderley2k

Resolvendo este problema, vou poder tirar coisas deste tipo da minha classe:

@Transient
	public List<Os> getOrdemDeServicos(Session session) {
		if (ordemDeServicos == null) {
			this.ordemDeServicos = (List<Os>) session.createCriteria(Os.class)
					.add(Restrictions.eq("bfj.chvbfj", this.chvbfj)).addOrder(
							Order.asc("dem")).list();
		}

		return ordemDeServicos;
	}
Alexandre

Esses nomes de tabela e de atributos são realmente do seu sistema?

Alexandre_Vilas_Boas

Wanderley, vê se é isso que precisa

Na tua classe Cli:

@ManyToOne
@JoinColumn(name = "chvbfj")
private Bfj bfj;

agora na Bfj:

@OneToMany(mappedBy = "bfj", cascade = CascadeType.ALL, fetch = FetchType.EAGER) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List<Cli> clientes;

Tenta aí

Wanderley2k

Se este fosse o único relacionamento OneToMany funcionaria, como tenho outros dá erro de:

Caused by: org.hibernate.HibernateException: cannot simultaneously fetch multiple bags at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:66) at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:75) at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:43) at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:33) at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:103) at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1697) at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1701) at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:2932) at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:2925) at org.hibernate.persister.entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:690) at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:290) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291) at br.com.centauro.dao.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:68) ... 21 more

Andei dando uma lida no seguinte tópico: http://forum.hibernate.org/viewtopic.php?p=2310316& e nos adjacentes a ele também.

Se alguém souber como driblar este problema, vou ficar bem grato! =)

A

Muito confuso os nomes dos seus campos.
Eu ja entendi…mas achei estranho. Sabe porque?
Caso voce entre de ferias, fique doente , seu chefe queira te da uma promocao, etc…
Será mais dificil , porque esse zxyvbi so voce entende…

Lembre-se, para sair de um cargo atual, para um melhor.
Voce tem que permitir que alguem ocupe seu lugar atual, caso contrario, voce sempre ficará nele…

[]'s…

Wanderley2k

Pessoal,

Não fui eu que defini os nomes do campo. Vamos focar no problema. =) Eu também acho que estes nomes são uma meleca. Satisfeitos? =)

G

Para o problema “cannot simultaneously fetch multiple bags”

neste site tem dicas de como solucionar este problema

http://www.jroller.com/eyallupu/entry/hibernate_exception_simultaneously_fetch_multiple

Criado 23 de dezembro de 2006
Ultima resposta 8 de out. de 2007
Respostas 7
Participantes 5