2012-02-07 9 views
19

Actualmente estoy jugando con ORMlite para hacer un modelo con tablas y relaciones. Una relación es una relación de muchos a muchos. ¿Cuál es la mejor manera de implementar eso?¿Cuál es la mejor manera de implementar relaciones de muchos a muchos usando ORMLite?

Para ser más concretos:

Digamos que tengo estas dos tablas

Product 
    id 
    brand 

Purchase 
    id 

Una compra puede tener varios productos y los productos pueden ser uno en varias compras. Usando ORMLite podría tener un @ForeignCollectionField en cada modelo, pero no creo que funcione. La única solución válida que veo es crear una tercera tabla Product_Purchase para vincular el producto y la compra con relaciones de varios a uno.

¿Qué piensan ustedes?

Respuesta

27

@ La auto-respuesta de Romain es correcta, pero aquí hay algo más de información para la posteridad. Como se menciona no es un ejemplo de muchos a muchos ORMLite proyecto que demuestra la mejor manera de hacer esto:

http://ormlite.com/docs/example-many

El ejemplo utiliza una tabla de unión con los identificadores de los dos objetos para almacenar una relación. En la pregunta de @ Romain, el objeto de unión tendría tanto el objeto Product como el objeto Purchase. Algo así como:

public class ProductPurchase { 
    @DatabaseField(generatedId = true) 
    private int id; 
    @DatabaseField(foreign = true) 
    private Product product; 
    @DatabaseField(foreign = true) 
    private Purchase purchase; 
    ... 
} 

Los campos ID Cómo extraen de los objetos que crea una tabla como:

CREATE TABLE `userpost` (`id` INTEGER AUTO_INCREMENT , `user_id` INTEGER , 
    `post_id` INTEGER , PRIMARY KEY (`id`)) 

A continuación, utiliza consultas internas para encontrar los Product objetos asociados con cada Purchase y viceversa. Consulte el método lookupPostsForUser() en el proyecto de ejemplo para obtener más información.

Ha habido un cierto trabajo de pensamiento y diseño al hacer esto de forma automática, pero ahora mismo ORMLite solo maneja las relaciones de uno a muchos internamente.

+0

Ok muchas gracias grises! Solo quería estar seguro y lo explicaste bien. –

+1

Gracias también por la respuesta, pero Gray, este hecho está muy poco documentado .. No es bueno para las aplicaciones masivas de Android que quieren usar ORMLite .. – eento

+0

¿Puede ser más específico @eento? ¿Puedes escribir algunos documentos mejores? – Gray

6

Ok, supongo que el único camino a seguir es crear una tercera tabla Product_Purchase. Se indica en un sample project.

-1

Tienes que crear una clase de compra de productos y administrarla como si fuera otro objeto que debe entrar en tu base de datos.

Puede (pero no es necesario) tener una Colección de productos dentro de las Compras (y viceversa), pero deberán actualizarse/crearse manualmente cuando cargue las relaciones entre los Productos y las Compras del ProductoCompra tabla enlazadora Tener esas colecciones no significa nada para el ORM (no las anotarás ni las debes anotar).

Si alguien está buscando y Android App con la relación de varios a varios trabajé en un ejemplo: https://github.com/arthurrauter/ormlite-android

Cuestiones relacionadas