2012-08-17 34 views
5

¿cómo puedo mapear una relación de uno a muchos en Hibernate donde los muchos lados deben ser paginados? (es decir, tiene cientos o más objetos relacionados)
El uso de la anotación OneToMany (o su equivalente xml) no es útil porque al cargar el objeto de un solo lado recupera todos sus objetos relacionados causando un desastre de memoria (aunque use perezoso cargando).
Un posible enfoque (que ya estoy usando) es agregar un método getter en una implementación DAO, donde puede introducir parámetros de paginación. Sin embargo, puedo ver que esto no es ideal porque se pierden algunas características como la conexión en cascada (por ejemplo, tengo que incluir métodos setter en la clase DAO para asociar objetos). Además, pierde algún sentido OOP ya que el objeto de un lado no tiene un método para recuperar sus objetos relacionados de muchos lados. ¿Cuál es la mejor solución?
Para ilustrar más mi punto, digamos que tengo dos clases con la siguiente relación entre ellas: A has-many B.
No puedo escribir un método A.getAllB() usando una anotación de OneToMany, ya que hay cientos de Bs relacionado con un A. Por lo tanto, para paginar los resultados, creo una clase ADaoImpl separada con un método getAllB() donde puedo incluir paginación params para devolver solo una página de datos a la vez. ¿Es esto correcto? Cualquier ayuda será apreciada.Hibernate paginated OneToMany relación

Respuesta

2

Creo que haría lo mismo que está proponiendo: crear un nuevo método en mi dao que tome los parámetros de paginación y devuelva la página de resultados especificada. Si usted quiere o no mantener a los niños en su objeto primario depende de usted. Puede crear un campo transitorio para esos objetos.

public class Parent { 
    @Transient 
    private List<Child> children; 

    } 

    public class ParentDao { 

    // Solution 1 - You can keep the parent/child association 
    public void loadChildren(Parent parent, int firstResult, int maxResults) { 
     // do your query 
     parent.setChildren(query.list()); 
    } 

    // Solution 2 - Or just have your dao directly return the children and remove the list from Parent 
    public List<Children> getChildren(Parent parent, int firstResult, int maxResults) { 
     // do your query 
     return query.list(); 
    } 
    } 

Sé lo que quieres decir con romper la sensación de OO del código. Pero realmente la paginación es una función de la capa de datos. Ir con la primera solución puede restaurar algo de esa agradable sensación de "OO".

Cuestiones relacionadas