Mapeamento 1-N JPA usando XML

7 respostas
paulohbmetal

Fala aí pessoal, blz? Seguinte, estou eu aqui levando uma taca do JPA… Estou desenvolvendo um projeto que um dos requisitos é usar JPA e fazer o mapeamento das classes via XML(orm.xml). Bom, até aí tudo bem mas o problema é que estava precisando fazer um mapeamento 1-N e de acordo com esse tutorial isso não é possível se não for criada uma tabela intermediária ou JoinTable. Quando vi isso eu quase caí pra trás, não acreditando. E agora José? Como criar esse mapeamento sem criar essa dita tabela?

Valeu!

A Paz!

7 Respostas

Leozin

Falae mano beleza?

Acho que não precisa de uma tabela intermediária

Por annotations ficaria assim:

@Entity
public class Pai {
  @Id
  @Column( name="idPai" )
  private Long idPai;

  @OneToMany( mappedBy="pai" )
  private List<Filho> filhos;
  //...
}

@Entity
public class Filho {
  @ManyToOne
  @JoinColumn( name="idPai", referencedColumnName="idPai")
  private Pai pai;
  //...
}

Por XML ficaria assim:

<entity-mappings>
    <entity class="Pai">
        <attributes>
            <id name="id">
                <column name="idPai"/>
            </id>
            <one-to-many name="filhos" mapped-by="pai" />
        </attributes>
    </entity>

    <entity class="Filho">
        <attributes>
           <many-to-one name="pai">
              <join-column name="idPai" referenced-column-name="idPai" />
           </many-to-one>
        </attributes>
    </entity>
</entity-mappings>

Vale lembrar que o joinColumn na verdade, o “name” é a FK da entidade atual, e o referencedColumnName é a PK da entidade alvo (nesse caso, a tabela filho tem uma FK que é idPai e a tabela pai tem uma PK que é idPai também)

Espero ter ajudado, qualquer coisa dá um grito ae :slight_smile:

paulohbmetal

Fala brother, valeu pela resposta aí… Cara, ficou umas coisas que não expliquei… Dessa forma aí eu resolvi mas, na verdade, eu queria fazer é o seguinte: na minha classe Pai eu teria uma lista de Filhos e na minha classe Filho não teria nada referenciando a classe Pai, ou seja, minha classe Filho não teria que ter o atributo idPai. Daí minhas classes ficariam assim:

public class Pai {
    private long id;
    private List&lt;Filho&gt; filhos;
    //...
}

public class Filho {
    private long id;
    private String nome;
    //...
}

Neste caso o relacionamento da composição seria somente do Pai para o Filho e não também o contrário.

Valeu!

A Paz!

Leozin

ah entendi

então tu quer algo do tipo “ManyToMany”?

paulohbmetal

Não! :slight_smile: Quero OneToMany mas com o relacionamento(nas classes) unidirecional.

Ou seja, quero:

[b]
Pai -&gt Filho

e não

Pai &lt-&gt Filho
[/b]

Entendeu?!

A Paz!

Leozin

AHHHHHHHHH tá! :)

Vamos lá então

Nesse caso, quando é unidirecional, você vai precisar usar o tão sonhado JoinTable :(

Como funciona:

Tabela pai (owner do relacionamento)

@Entity
 public class Pai {
   @Id
   @Column( name="idPai" )
   private Long idPai;
 
   @OneToMany
   @JoinTable( name="NOME_DA_TABELA",
      joinColumns=@JoinColumn( name="idPai" ),
      inverseJoinColumns=@JoinColumn( name="idFilho" )
   private List<Filho> filhos;
   //...
 }

Agora basta criar na tabela NOME_DA_TABELA os campos idPai e idFilho como sendo FKs pras suas respectivas tabelas :)

chicocx

Outra forma, mais facil, será com a anotação:

@JoinColumn(name="NOME_DA_COLUNA")

Assim:

public class Pedido{
   private int codigo;
   @JoinColumn(name="COD_PEDIDO")
   @OneToMany(...)
   private List<Item> itens;
}


public class Item{
   private int codigo;
   private String descricao;
}

Isto criará a coluna COD_PEDIDO na tabela Item

V

Pessoal , entendo a sintaxe do mapeamento …mas nao sei onde eh definido o arquivo xml no projeto e como fica a configuracao do arquivo persistence.xml alguem poderia de dar uma luz a respeito disso ?

Criado 1 de agosto de 2007
Ultima resposta 18 de dez. de 2007
Respostas 7
Participantes 4