2011-06-13 21 views
11

Imaginemos que queremos construir una aplicación como eBay en la que tenemos una entidad llamada Customer y una entidad llamada Order.¿Cuándo es apropiado usar una asociación bidireccional y cuándo no?

Desde una perspectiva relacional, me gustaría modelar esto como:

Customer 
+----+-----+ 
| ID | ... | 
+----+-----+ 

Order 
+----+-------------+-----+ 
| ID | CUSTOMER_ID | ... | 
+----+-------------+-----+ 

Ahora cuando quiero asignar este a JPA, tengo varias opciones:

  1. Crear un uni-direccional muchos a una asociación de Order to Customer. En mi humilde opinión, este es el más cercano al modelo relacional. La desventaja es que para encontrar todos los pedidos para un cliente determinado, tengo que escribir una consulta JPQL porque el cliente no sabe nada sobre sus pedidos. Además, no puedo de forma natural agregar un nuevo pedido para un cliente (por ejemplo, customer.addOrder(aNewOrder);).

  2. Cree una asociación de uno a muchos desde el cliente al pedido. De esta forma, para encontrar todos los pedidos para un cliente determinado, puedo usar customer.getOders() y puedo agregar nuevos pedidos para un cliente de forma natural. El inconveniente es que para encontrar al cliente que ha realizado un pedido determinado, debería usar JPQL.

  3. Cree una asociación uno a muchos bidireccional desde el cliente al pedido. De esta forma, no es necesario que escriba ninguna consulta JPQL para recuperar todas las órdenes de un cliente o del cliente que ha realizado un pedido determinado. La desventaja es que se agrega complejidad para mantener la asociación bidireccional.

Como tal no veo un argumento definido en cuanto a si una asociación unidireccional tiene que ser utilizado o una asociación bidireccional es "correcta". En otras palabras, me parece que todo se reduce a las preferencias personales y al gusto del diseñador/implementador del modelo.

¿Estoy en lo correcto o hay reglas según las cuales es posible determinar la direccionalidad correcta para una asociación dada?

+0

Utiliza una relación bidireccional cuando necesita acceso desde ambos lados, obviamente. La solución de persistencia no debe figurar en esa elección en absoluto. – DataNucleus

+1

@DataNucleus: pero, en última instancia, es posible averiguar los pedidos de un cliente o del cliente que ha realizado un pedido determinado, independientemente de si la asociación es bidireccional o no. –

+0

Por supuesto, pero mi punto es que diseñe su modelo para que se ajuste a cómo se usa en su aplicación, no para acomodar la capa de persistencia. Sí, siempre es posible obtener los pedidos de un cliente o cliente para un pedido, ya sea bidir o no, usted elige el mecanismo para obtener esa información en función del rendimiento, etc. – DataNucleus

Respuesta

7

Mucho depende de su cantidad esperada de pedidos por cliente. Si espera muchos pedidos por cliente (piense en eBay), tener un cliente con todos los pedidos asociados no será muy eficiente (o le costará un poco mantener una asociación perezosa). En este caso, recomiendo el enfoque n. ° 1. No hay nada de malo en escribir algunas consultas.

Sin embargo, si espera clientes en su mayoría con pocos pedidos, el enfoque bidireccional # 3 funcionará bien.

No veo mucho valor en el n. ° 2 ya que el orden siempre está asociado a un cliente.

Cuestiones relacionadas