Pregunta

Fondo

Tengo una tabla con columnas Identificación, ImageID, propertyId .

Puede haber varias imágenes asociadas a una sola propiedad y podría haber muchas propiedades asociadas con una sola imagen.

imageId - many-to-many - propertyId

Tengo una lista de PropertyIDs y yo quiero descubrir todas las imágenes asociadas con todas las PropertyIDs usando Hibernate .

problema.

Ahora mismo tomo una propiedad a la vez y utilizar la API Criterios encontrar todos los imageIds asociados a este propertyId, puedo obtener una lista de imageIds. Yo uso esta lista de imageIds en la consulta siguiente y digo

select imageIds where imageId in (imageIds obtained in previous step) where propertyId = x

Así que efectivamente, el número de consultas que golpean el DB sería igual al número de PropertyIDs. No creo que esto es una buena solución, tener que golpear las veces de base de datos n, He intentado utilizar Independiente de consulta pero no tuvo éxito. ¿Hay una solución mejor?

Además, cuando finalmente obtener la relación de imageIds, ¿es una buena idea (no la tenemos en cuenta el número de resultados) para almacenarlo en la sesión de usuario y paginar o es una buena idea repetir la totalidad proceso o tendría que considere la posibilidad de almacenarla en la base de datos todo con el propósito de paginación?

¿Fue útil?

Solución

Aquí hay un problema con el esquema de base de datos:

Usted está tratando de meter 3 asociaciones separadas (imagen - Colección, Imágenes - propiedad, colección - propiedad) en un solo ImageCollection mesa. Esto no es bueno. Mientras que probablemente podría salirse con la suya utilizando SQL normal (a un costo de un montón de filas con columnas nulos en esa tabla), usted no será capaz de asignar adecuadamente esta en Hibernate. Por cierto, esta tabla no necesita una clave primaria sustituta.

Lo que hay que hacerlo se divide en 3 mesas separadas y mapear su modelo como propio de muchos a muchos en hibernación. Por ejemplo:

@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}

Mesa IMAGE_PROPERTIES solamente tendrá columnas IMAGE_ID y PROPERTY_ID; tendrá mesas COLLECTION_IMAGES y COLLECTION_PROPERTIES al igual que también.

A continuación, será capaz de consultar imágenes por nombres de propiedades como:

from Image img
  left join img.properties as prop
  with prop.name in ('Tag1', 'Tag2', 'Tag3')

Si sus propiedades son realmente como etiquetas, echar un vistazo a este artículo por y ejemplos de consulta / O / Union.

Si las propiedades son realmente propiedades (es decir, tienen el ciclo de vida de la entidad propietaria y no pueden pertenecer a más de una entidad a la vez), considerar dividir en dos tablas (una por Imágenes y uno para colecciones) y mediante asociaciones uno-a-muchos. De esa manera no va a necesitar tablas IMAGE_PROPERTIES y COLLECTION_PROPERTIES desde arriba.

Otros consejos

Así que hay una clase como esta (Nota: Yo no escribí esto con un IDE, por lo que el código no puede ser sintácticamente correcta):

public class Property {
@ManyToMany
private List<Image> images;
}

public class Image {
@ManyToMany
private List<Property> properties;
}

Así que una consulta como select property from Property property debe obtener la lista de propiedades, que se puede llegar a través de las propiedades normales de Java.

Es eso lo que está buscando, o que me entiendan mal la pregunta?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top