2009-03-12 7 views
1

2つのテーブルがあるとします。従業員給与と1:Nの関係従業員)。Grails/GORMのレガシーマッピング:1つのドメインクラスと2つのテーブルが1:N関係にある

プレーンSQLでテーブルはと結合することになります。

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

は、私はクラスに、従来のデータベース構造をマッピングしないか、以下のGORM搭載のドメインクラスを想定すると?

class Employee { 
    String name 
    int salary 
} 

明確化#1:私は両方のテーブルからのデータを含む唯一のドメインクラスをしたいです。したがって、別のクラスを追加することはオプションではありません。

明確化#2:私は答えを見つけようとしている質問は、「どのように私はGrailsの/ GORMを使用して1クラスに2つのテーブルをマッピングしない」だけですか?あなたがそうすることが不可能だと思うなら、質問を再記述するのではなく、あなたの答えにそのことを明確に述べてください。

+1

2番目のクラスを持つことができないという非常に奇妙な要件です。通常、2つのテーブルを持つことはできません。この要件は、より大きな問題の症状である可能性があり、それを解決することはすべての小さな問題を一挙に解決します。理由を説明するのは良いことです。 – Chii

答えて

2

IMO Grails/GORMは、複数のテーブルを結合して1つのドメインクラスにマッピングすることはできません。この問題を回避するには、従来のXMLハイバネーションマッピングを使用し、join featureを活用して目的の目標を達成することができます。もちろん、あなたはGORMグッズをたくさん失うでしょう。

0

SQLの例では、従業員と給与の2つのテーブルがあることを示しています。これはあなたのクラスに反映されるべきです。だから1つではなく、2つのクラスが必要です。 GORMマッピングは、このようになります。

class Employee { 
    String name 
    Salary salary 
} 

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

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

+0

あなたの答えをありがとうが、別のクラスを追加することはできません。私の説明を参照してください。 – knorv

-1

を参照してください、私は完全には、データベース内の2つのテーブルがある場合は、別のクラスを追加することができないに制限を理解していないが、あなたは統一されたインタフェースを持って探しているならメソッドをSalaryクラスに委譲することはできますか?

何かのように:

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 

それはあなたがマッピングファイルを休止カスタムで仕事を求めているものを作ることができるかもしれないということも可能だが、私はその中で冬眠contortingに十分慣れていないんですよ確かに言う方法。

Custom User Type section of this pageを参照してください。

0

プロパティとして給与と名前を使用する代わりに、実際にこれらの両方のテーブルに対してクエリを実行するget *メソッドとして持つことができます。

与えられた、それはgrailsの方法ではないので、grailsの方法に従うことを強くお勧めします。

関連する問題