Dúvida - Tabelas Relacionadas em Classes

Sou iniciante e estou com uma dúvida, tenho duas tabelas relacionadas e gostaria de saber a melhor forma de representá-las em classes:

Tabela PEDIDO
ID_PEDIDO (PK)
DT_PEDIDO
(…)

Tabela PEDIDO_ITEM
ID_ITEM (PK)
ID_PEDIDO (FK)
VL_ITEM
(…)

As duas formas abaixo de representar em classes estão corretas? Ou seja, dependendo da forma de persistência e design pattern, cada uma tem sua vantagem? Sei que a primeira forma é mais comum, mas a segunda forma é errada ou aceitável? No caso, estou usando Spring MVC + JDBC Template, com padrão “dto > repository > service > controller”.

FORMA 1 (classe Pedido com atributo “lista de itens”):

public class Pedido {

	private Long id;
	private Calendar dtPedido;
	private List<PedidoItem> itens;
	// (...)
	
}

public class PedidoItem {

	private Long id;
	private Double vlItem;
	// (...)
	
}

FORMA 2 (classe PedidoItem com atributo da classe “Pedido”):

public class Pedido {

	private Long id;
	private Calendar dtPedido;
	// (...)
	
}

public class PedidoItem {

	private Long id;
	private Pedido pedido;
	private Double vlPedido;
	// (...)
	
}

Grato.

Ola

Eu pensaria da seguinte forma:

  • A partir de uma instancia do PedidoItem vc precisa saber o Pedido?

Se sim, a forma 2 é bem agradavel.

  • A partir de uma instancia da classe Pedido vc precisa saber todos os PedidoItem ?

Se sim, quão frequente vc precida dessa informação?

Eu não sei, baseado no que vc descreveu, quem é que faz a interface com o banco de dados, mas imagine que vc tem um objeto “repositorio” de dados.


Pedido pedido = new Pedido( id );
List<PedidoItem> itens = repositorio.getItensFromPedido( pedido );

Se vc SEMPRE precisa dos itens, então faz sentido eles serem um atributos itens

Porém, se vc NEM SEMPRE precisa, carregar isso tudo pode ser custoso ( banco de dados, memoria, etc ). O Hibernate pode resolver isso ( acho ) dizendo que isso é @lazy

Agora imagine que vc lida com centenas de milhares de PedidoItem, talvez não seja necessario vc ter uma referencia ao pedido original se o repositorio pode fazer


Pedido pedido = repositorio.getPedidoFromItem( item );

como eu disse, depende do contexto. em geral SE vc não tem grandes restrições de memoria ou performance, não perca muito tempo.

mas quem diz como as suas classes devem se relacionar, IMHO, é o contexto delas.

Até porque existe um Padrão chamado ActiveRecord onde uma Classe ou Instancia é capaz de falar com o banco de dados diretamente. Ai não importa se vc tem um atributo itens em pedido, mas que o objeto Pedido tem uma referencia ao repositorio de dados e ele pode fazer as queries na ordem desejada.

Ou deixe na mão do Hibernate ou outro ORM

Cara, obrigado!

No caso, estou acesso o banco pelas classes repository com JDBC Template, fazendo uma query direto na tabela que representa a classe, usando o segundo exemplo.

Portanto, para a classe PedidoItem, tenho a classe PedidoItemRepository, onde faço a query na tabela PEDIDO_ITEM, e populo o atributo Pedido através da PedidoRepository.