Aquí podría ser tu PUBLICIDAD


Mapeo de legado en Grails / GORM: una clase de dominio y dos tablas en una relación 1: N

votos
1

Digamos que tengo dos tablas de empleado y salario con una relación 1: N (un salario puede asociarse con muchos empleados).

En SQL simple, las tablas se unirían a:

SELECT e.id, e.name, s.salary FROM employee e, salary s WHERE s.id = e.salary_id AND e.id = 12345;

Asumiendo la siguiente clase de dominio alimentada por GORM, ¿cómo mapeo la estructura de la base de datos heredada a la clase?

class Employee {
   String name
   int salary
}

Aclaración # 1: quiero solo una clase de dominio que contenga datos de ambas tablas. Por lo tanto, agregar otra clase no es una opción.

Aclaración n.º 2: la pregunta a la que intento encontrar una respuesta es simplemente ¿cómo puedo asignar dos tablas a una clase usando Grails / GORM? Si cree que es imposible hacerlo, indíquelo claramente en su respuesta en lugar de intentar volver a formular la pregunta.

Publicado el 12/03/2009 a las 18:54
fuente por usuario knorv
En otros idiomas...        العربية       

4 respuestas

votos
2

IMO no es posible con Grails / GORM simple unir varias tablas y asignarlas a una clase de dominio. Como solución, puede usar una asignación de hibernación XML heredada y aprovechar la función de unirse para lograr su objetivo deseado. Por supuesto, perderías muchos de los objetos GORM.

Respondida el 16/03/2009 a las 11:31
fuente por usuario Siegfried Puchbauer


Aquí podría ser tu PUBLICIDAD


votos
0

Podría, en lugar de tener el salario y el nombre como propiedades, tenerlos como métodos get * que realmente ejecuten una consulta en ambas tablas.

concedido, ese no es el camino de los griales, y es muy recomendable que sigas el camino de los griales.

Respondida el 14/03/2009 a las 05:23
fuente por usuario Chii

votos
0

Su ejemplo de SQL indica que hay dos tablas, Empleado y Salario. Esto también debería reflejarse en tus clases. Entonces, en lugar de uno, necesitas dos clases. El mapeo GORM se vería así.

class Employee {
   String name
   Salary salary
}

class Salary {
   static hasMany = [ employees : Employee ]
   int salary
}

Ver http://www.grails.org/GORM+-+Defining+relationships

Respondida el 12/03/2009 a las 07:51
fuente por usuario Johan Pelgrim

votos
-1

No entiendo completamente la limitación de no poder agregar otra clase si hay 2 tablas en la base de datos, pero si está buscando tener una interfaz unificada, ¿funcionaría para delegar los métodos a la clase Salario?

Algo como:

class Salary {
    int amount
}

class Employee {
    Salary _salary
    String name

    String toString() { name }

    public Integer getSalary() {
        return _salary?.amount
    }
    public void setSalary(Integer amount) {
    // not quite sure of your business logic here, this is a guess
        _salary = Salary.findByAmount(amount)
        if (!_salary) {
            _salary = new Salary(amount: amount)
            _salary.save()
        }
    }
}


def e = new Employee(name:"willy loman", salary: 100)
e.save()
assert e.salary == 100

También es posible que pueda hacer lo que está pidiendo que trabaje con un archivo de mapeo hibernate personalizado, pero no estoy lo suficientemente familiarizado con contorsionar hibernate de esa manera para decirlo con certeza.

Consulte la sección Tipo de usuario personalizado de esta página .

Respondida el 14/03/2009 a las 04:37
fuente por usuario Ted Naleid