Sobre mapeamento objeto-relacional

Oi pessoal,

bom, terminei de ler um artigo muito bom sobre JPA no javaworld, aki estão os links:


Nesse artigo so tem uma coisa que eu não entendi. Quando eu faço um classe quem uma associação qualquer, por exemplo Fatura está associada a um Pedido, uma associação um-para-um… Então, na classe Fatura eu vou colocar um atributo do tipo Pedido para representar essa associação. Até aí tudo bem.

Mas, no artigo, o exemplo dado, além de colocar na classe Fatura o atributo pedido do tipo Pedido, coloca também um atributo que representa a chave estrangeira na tabela Fatura que é a chave primária na tabela Pedido.

Até tentei postar la no artigo a duvida mas por algum motivo eu não consegui.

Bom, aki está a classe que foi colocada no artigo:

@Entity(name = "ORDER_INVOICE") 
public class Invoice {
       
       @Id 
       @Column(name = "INVOICE_ID", nullable = false)
       @GeneratedValue(strategy = GenerationType.AUTO)
       private long invoiceId;
       
       @Column(name = "ORDER_ID")
       private long orderId;
       
       @Column(name = "AMOUNT_DUE", precision = 2)
       private double amountDue;
       
       @Column(name = "DATE_RAISED")  
       private Date orderRaisedDt;

       @Column(name = "DATE_SETTLED")  
       private Date orderSettledDt;
       
       @Column(name = "DATE_CANCELLED")  
       private Date orderCancelledDt;
       
       @Version
       @Column(name = "LAST_UPDATED_TIME")
       private Date updatedTime;
       @OneToOne(optional=false)
       @JoinColumn(name = "ORDER_ID") 
       private Order order;       
       ...
       //getters and setters goes here
}

Como vocês podem ver, a classe tem o atributo orderId.

Bom, essa coisa de colocar chave estrangeira é logica relacional, e não OO.

Será que é alguma imposição do JPA para que o campo seja criado na tabela Fatura?

VLW

Voce nao precisa usar o int orderId - e geralmente nao usa mesmo -, usando no lugar a classe Order (o que tem mais sentido). No lugar de

@Column
private int orderId;

use a classe, com JoinColumn:

@OneToOne
@JoinColumn(name = "order_id")
private Order order;

Ai fica OO.

Rafael

[quote=Rafael Steil]Voce nao precisa usar o int orderId - e geralmente nao usa mesmo -, usando no lugar a classe Order (o que tem mais sentido). No lugar de

@Column
private int orderId;

use a classe, com JoinColumn:

@OneToOne
@JoinColumn(name = "order_id")
private Order order;

Ai fica OO.

Rafael[/quote]

Com certeza kra… so fiquei meio sismado porque nesse artigo que sitei acima, os caras colocaram os dois, aí eu pensei que pudesse ser algum tipo de exigência do JPA…

Enfim, colocando apenas o atributo do tipo Order, e não colocando o atributo orderId funciona, certo?