Hibernate one-to-one com a mesma classe

12 respostas
thadeurc

Pessoas,

Alguem por acaso sabe como fazer o mapeamento one-to-one onde ambas as classes são as mesmas.

Só para deixar mais claro meu problema:

public class Tarefa{

private Integer id;

private String nome;

private Tarefa tarefaFilha;

// gets e sets

}

como mapear isso de forma que quando eu procure o id da tarefa ele me traga sua filha???

grato

12 Respostas

maresp

Vc consegue a recursividade simplesmente mapeando sua instância para um campo na tabela que vai conter a pk do objeto.

_fs

Exemplificando com one-to-many

<bag lazy="true" name="childs" inverse="true"
		table="tModulos" cascade="none">
	<key column="IDparent"/>
	<one-to-many class="meu.pacote.Teste" />
</bag>
thadeurc

valeu pela força gente :slight_smile:

thadeurc

Ainda nao rolou pois eu quero usar a mesma classe interna… usando o bag nao vira pois eh como usar uma collection. Estou lendo que nem louco a documentação mas ela nao tem exemplos bons para o que eu procuro… Caso alguem tenha uma interpretação melhor que a minha :slight_smile:

thadeurc

Andei pesquisando no site do hibernate e nao achei nenum exemplo como este que necessito fazer. Uma solução (porca) seria dizer que uma tarefa tem um relacionamento one-to-many com tarefa mas não gostaria de fazer desse modo.

Se alguem consegui ou consegue mapear um one-to-one da mesma classe help me please :frowning:

legionarioba

Hbm:

<?xml version="1.0"?>
&lt;!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" &gt;

&lt;hibernate-mapping package="aplicacao"&gt;
	&lt;class name="Func" table="func"&gt;
		&lt;id
			column="oid_func"
			name="oidFunc"
			type="java.lang.Long"
		&gt;
			&lt;generator class="vm" /&gt;
		&lt;/id&gt;
		&lt;property
			column="des_func"
			length="100"
			name="desFunc"
			not-null="true"
			type="string"
		 /&gt;
		&lt;many-to-one
			class="Func"
			name="oidFuncPai"
			not-null="false"
		&gt;
			&lt;column name="oid_func_pai" /&gt;
		&lt;/many-to-one&gt;
		&lt;set
			inverse="true"
			lazy="true"
			name="set"			
		&gt;
			&lt;key column="oid_func_pai" /&gt;
			&lt;one-to-many class="Func" /&gt;
		&lt;/set&gt;
	&lt;/class&gt;
	&lt;query name="obterPorPkFunc"&gt;
		&lt;![CDATA[from Func as func left outer join fetch func.set where func.oidFunc = :oidFunc]]&gt;
	&lt;/query&gt;	
&lt;/hibernate-mapping&gt;
legionarioba

Classe:

package aplicacao;

import java.io.Serializable;

public class Func implements Serializable{

    private int hashCode = Integer.MIN_VALUE;

	// primary key
	private java.lang.Long oidFunc;

	// fields
	private java.lang.String desFunc;

	// many to one
	private aplicacao.Func oidFuncPai;

	// collections
	private java.util.Set set;

	public Func () {		
	}
	
	public java.lang.Long getOidFunc () {
		return oidFunc;
	}

	public void setOidFunc (java.lang.Long _oidFunc) {
		this.oidFunc = _oidFunc;
		this.hashCode = Integer.MIN_VALUE;
	}

	public java.lang.String getDesFunc () {
		return desFunc;
	}

	public void setDesFunc (java.lang.String _desFunc) {
		this.desFunc = _desFunc;
	}

	public aplicacao.Func getOidFuncPai () {
		return this.oidFuncPai;
	}

	public void setOidFuncPai (aplicacao.Func _oidFuncPai) {
		this.oidFuncPai = _oidFuncPai;
	}

	public java.util.Set getSet () {
		return this.set;
	}

	public void setSet (java.util.Set _set) {
		this.set = _set;
	}
	
	public void addToSet (Object obj) {
		if (null == this.set) this.set = new java.util.HashSet();
		this.set.add(obj);
	}
	
	public boolean equals (Object obj) {
		if (null == obj) return false;
		if (!(obj instanceof aplicacao.Func)) return false;
		else {
			aplicacao.Func mObj = (aplicacao.Func) obj;
			if (null == this.getOidFunc() || null == mObj.getOidFunc()) return false;
			else return (this.getOidFunc().equals(mObj.getOidFunc()));
		}
	}
	
	public int hashCode () {
		if (Integer.MIN_VALUE == this.hashCode) {
			if (null == this.getOidFunc()) return super.hashCode();
			else {
				String hashStr = this.getClass().getName() + ":" + this.getOidFunc().hashCode();
				this.hashCode = hashStr.hashCode();
			}
		}
		return this.hashCode;
	}

}
legionarioba

Query:

// Utilizando Named Query
        Query q = s.getNamedQuery("obterPorPkFunc");            
        q.setLong("oidFunc",1);            
        Func f = (Func)(q.list().get(0));       
        s.close();            
        System.out.println("############################");
        System.out.println("Func:" + f.getDesFunc());
        System.out.println("############################");
        Iterator i = f.getSet().iterator();            
        while (i.hasNext()){
            Func f2 =(Func) i.next();
            System.out.println("############################");
            System.out.println("Subalternos: " +f2.getDesFunc());                
            System.out.println("############################");                
        }

Vê se funciona ai e da um feedback ok?

[]'s

thadeurc

valeu cara… este lance da named quer eu nao sabia que dava para usar no hibernate.

Vou testar sim mas este tipo de mapping eu sei fazer eu estava procurando um de one-to-one onde a classe possui um atributo dela propria…

Mas fico grato do mesmo modo.

Assim que eu testar eu dou o feed back certinho…

[]´s

legionarioba

Pode ser um pouco mais claro??

thadeurc

Posso sim.

Eu gostaria de mapear uma classe semelhante como a que vem abaixo:

public class Tarefa{
          private Long id;
          private String descricao;
          private Tarefa tarefaFilha;
          
          //gets and sets
}

Ou seja, uma tarefa tem ( composição ) uma tarefa filha, ou uma que ela dependa.

Ficou mais claro??

Eu tentei fazer o mapeamento one-to-one colocando o campo id (que eh um<id…> ) como chave mas não deu certo.

francofabio

conseguiu resolver, seu prob? se conseguiu por favor post a solução pq estou com um prob. semelhante tb…muito obrigado!!!

Criado 4 de abril de 2005
Ultima resposta 5 de jan. de 2007
Respostas 12
Participantes 5