2009-03-12 5 views
1

Sagen wir, ich habe zwei Tabellen Mitarbeiter und Gehalt mit einem 1: N-Beziehung (ein Gehalt kann mit vielen in Verbindung gebracht werden Angestellte).Legacy-Mapping in Grails/GORM: Eine Domain-Klasse und zwei Tabellen in einer 1: N-Beziehung

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

Unter der Annahme der folgenden GORM betriebenen Domain-Klasse, wie ich die Legacy-Datenbankstruktur der Klasse zuordnen kann:

Im Klar SQL würden die Tabellen mit verbunden?

class Employee { 
    String name 
    int salary 
} 

Klärung # 1: Ich möchte nur eine Domain-Klasse aus beiden Tabellen enthalten Daten. Das Hinzufügen einer anderen Klasse ist daher keine Option.

Klärung # 2: Die Frage Ich versuche, eine Antwort zu finden, ist einfach „wie ordne ich zwei Tabellen zu einer Klasse mit Grails/GORM“? Wenn Sie der Meinung sind, dass dies unmöglich ist, dann geben Sie dies bitte klar in Ihrer Antwort an, anstatt zu versuchen, die Frage neu zu formulieren.

+1

es ist eine sehr merkwürdige Anforderung, nicht in der Lage zu sein, eine zweite Klasse zu haben - normalerweise ist es umgekehrt, wo Sie zwei Tabellen nicht haben können. Diese Anforderung könnte ein Symptom für ein größeres Problem sein, und das Lösen dieser Probleme löst alle Ihre kleinen Probleme auf einmal. Es wäre gut, einen Grund dafür zu nennen. – Chii

Antwort

2

IMO ist es nicht möglich, mit einfachen Grails/GORM mehrere Tabellen zu verbinden und sie zu einer Domain-Klasse zuzuordnen. Als Workaround können Sie eine alte XML-Hibernate-Mapping verwenden und die join feature nutzen, um Ihr gewünschtes Ziel zu erreichen. Natürlich würden Sie viele der GORM-Goodies verlieren.

0

Ihr SQL-Beispiel gibt an, dass es zwei Tabellen gibt, Employee und Salary. Dies sollte sich auch in Ihren Klassen widerspiegeln. Also brauchen Sie anstelle von einem zwei Klassen. Das GORM-Mapping würde dann so aussehen.

class Employee { 
    String name 
    Salary salary 
} 

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

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

+0

Vielen Dank für Ihre Antwort, aber das Hinzufügen einer anderen Klasse ist nicht möglich. Bitte sehen Sie meine Klarstellung. – knorv

-1

Ich verstehe nicht ganz die Begrenzung nicht eine andere Klasse hinzufügen zu können, wenn es zwei Tabellen in der Datenbank sind, aber wenn Sie eine einheitliche Schnittstelle haben, suchen, Würde es funktionieren, die Methoden an die Gehaltsklasse zu delegieren?

Etwas wie:

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 

Es ist auch möglich, dass Sie möglicherweise in der Lage zu machen, was Sie mit einem benutzerdefinierten für Arbeit sind gefragt Mapping-Datei überwintern, aber ich bin nicht vertraut genug mit, dass Hibernate contorting Art und Weise zu sagen, sicher.

Siehe die Custom User Type section of this page.

0

Sie könnten, anstatt Gehalt und Namen als Eigenschaften zu haben, sie als get * -Methoden haben, die tatsächlich eine Abfrage für beide Tabellen ausführen.

gewährt, das ist nicht der Grals Weg, und es wird dringend empfohlen, dass Sie folgen den Grails Weg.

Verwandte Themen