Grailsシリーズ---The Application Domain


デスクトップ、サーバ、Mobileアプリケーション、Domainは、オブジェクト向け言語にかかわらず、プログラムにおいて重要です.
Domainは任意の企業アプリケーションの核心であり、例えば書店アプリケーションではBookが必要であり、ショッピングアプリケーションではOrderが必要であり、これらの企業エンティティは相互に関連しており、彼らの状態は保存されたり、後である時点で取り戻されたりすることができる.
OOPでは、Objectには属性、フィールド、メソッドがあります.データベース内のテーブルにはColumnsとprimary keysがあります.ORMを使用すると、オブジェクトとデータベースのマッピングが非常に簡単になります.
GrailsはSpring+Hibernateの上に構築されていますが、Grails Object-RelationalMapping(GORM)のより簡単なマッピングを提供しています.
GrailsはHibernate’を用いてAPIsを高度にカスタマイズして配置し,ORMマッピングをより使いやすくすることを考慮し,規約の力を用いてGrails Object-relational Mapping(GORM)という新しいマッピング戦略を用いる.
Domain classは、コマンドラインcreate-domain-classで作成できます.
grails create-domain-class Person
 grails-app/domain/Person.groovyのパスを持つクラスを作成します.
class Person {	
}
  DataSourceでdbCreate propertyを「update」に設定した場合、「create」or「create-drop」 , Grails wは、データテーブルの変更を自動的に生成します.
属性を追加することでDomain classをカスタマイズできます.
class Person {	
	String name
	Integer age
	Date lastVisit
}
  •  Basic CRUD
  • 基本的なCRUD(Create/Read/Update/Delete)操作. 
  • Create:Domainプロパティを設定し、saveメソッドを呼び出してデータベースに保存します(潜在的なhibernate ORMレイヤを使用):
    def p = new Person(name:"Fred", age:40, lastVisit:new Date())
    p.save()
     GroovyのnewオブジェクトとJavaの違いに注意してください.この点は、対応するGroovyシリーズの教材で説明します.
  • Read:Grailsは自動的に1つ追加されます  id propertyあなたのdomain classで、idを通じて対応するDomain classを取得します:
    def p = Person.get(1)
    assert 1 == p.id
  • Update:エンティティを更新し、プロパティを設定してからsaveメソッドを再度呼び出します.
    def p = Person.get(1)
    p.name = "Bob"
    p.save()
     
  • Delete:エンティティの削除deleteメソッド:
    def p = Person.get(1)
    p.delete()
     
  • Domain Modelling in GORM
  • では、domain in GORMをどのように設計するかを見てみましょう.
  • a domain classを作成コマンドラインプロンプトでcreate-domain-classを実行できます(このコマンドラインはプロジェクトパスで使用する必要があります.注意!):
    grails create-domain-class Book
     結果classはプロジェクトパスgrails-app/domain/Book.groovyの下で作成されます:
    class Book {	
    }
     注意:packagesを作成するには、classを対応するpackagesに移動する必要がありますが、grails-app/domainの下でJavaのpackagesルールに従ってpackagesを宣言する必要があります.上のClassはbookというデータテーブルに自動的にマッピングされます(classと同じ名前で、もちろん小文字です).これらはORM Domain Specific Language規則によって生成されます.
  • Javaタイプを使用して、properties
    class Book {
    	String title
    	Date releaseDate
    	String ISBN
    }
    の各プロパティがデータベース対応テーブルのcolumnにマッピングされることを定義できます.ここには、columnの名前はすべて小文字で、classのpropertiesが使用する「アルパカ」の書き方のpropertiesの名前を除いて「—」の記号を使用する必要があります.例えばreleaseDateは自動的にrelease_と書かれますdate.でもConstraints orで  ORM DSL.カスタム. 
  • GORMでの関連付け:
  • One-to-one
  • class Face {
        Nose nose
    }
    class Nose {	
    }
     上では、FaceからNoseへの一方向one-to-one関連付けを使用しています.双方向one-to-one関連付けを使用する場合は、次のコードを参照してください.
    class Face {
        Nose nose
    }
    class Nose {	
    	Face face
    }
     上の2つのコードは分かりやすいです.3番目のコードを見てみましょう.
    class Face {
        Nose nose
    }
    class Nose {	
    	static belongsTo = [face:Face]
    }
    上では「belongsTo」を使用して、NoseがFaceに属するように設定しました.
    new Face(nose:new Nose()).save()
    Faceを保存するときは、次のコードを使用する場合は、「belongsTo」関係であるため、Noseを保存する必要があります.
    new Nose(face:new Face()).save() // will cause an error
    エラーが発生します.
    お客様と注文を比較するには、もちろんここでは一対一を使用しています.一人のお客様が注文に対応して、お客様を保存すると同時に、その注文を一緒に保存しなければなりません.この注文はあるお客様に属しているので、逆に考えてみてください.注文はbelongsToを設定していないので、つまり彼は彼のお客様が誰なのか気にしません.belongsToはあるclassの属性と見なすことができて、もしあなたが1つのない属性を保存するならばもちろん間違いがあって、みんなが理解できるかどうか分からないで、これは私自身の意味です.
    続行:
    def f = Face.get(1)
    f.delete() // both Face and Nose deleted
     
    あるFacesを削除すると対応するNoseが同時に削除され、逆に成立しません.上記のように、あるNoseがFaceの属性である以上、belongsToが設定されているため、お客様が存在しなければ、注文には存在する価値があるのか、実はclassが削除され、彼の属性はまだ存在し続けるのか、しばらく理解しています.