1

委員会、メンバー、および委員会とメンバー間のメンバーシップを管理するために使用される、MySQL と vaadin を使用した休止状態、春のセキュリティ、および春のセキュリティ acl プラグインを使用して、grails で基本的な Web アプリケーションを作成しています。すべての CRUD はメンバーと委員会の両方で機能しますが、CommitteeMember オブジェクトを作成すると、クラスの Member フィールドを参照して、メンバーシップに関与するメンバーに関する情報を取得するのに問題があります。ここに私のクラスがあります:

class Committee {
    String name
    String description
    String bylaws
    static hasMany = [members: CommitteeMember]
    static constraints = {
        name blank: false, nullable: false, matches: "[a-zA-Z0-9 ]*", unique: true
        description blank: false, nullable: false, matches: "[a-zA-Z0-9 ]*"
        bylaws blank: false, nullable: false, matches: "[a-zA-Z0-9 ]*"
   }
}

class Member {
    String firstName
    String middleName
    String lastName
    String address
    String phone

    static hasMany = [committees: CommitteeMember]
    static constraints = {
        firstName blank: false, nullable: false, matches: "[a-zA-Z]*"
        middleName blank: false, nullable: false, matches: "[a-zA-Z]*"
        lastName blank: false, nullable: false, matches: "[a-zA-Z]*"
        address blank: false, nullable: false, matches: "[0-9a-zA-Z ]*"
        phone blank: false, nullable: false, minSize: 10, maxSize: 10, matches: "[0-9]*"
    }
}

class CommitteeMember {

    Member member
    Committee committee
    Date startDate
    Date endDate
    String title
    Date created = new Date()
    Date updated = new Date()

    static constraints = {
        startDate blank: false, nullable: false, format: 'mm/dd/yyyy'
        endDate blank: false, nullable: false, format: 'mm/dd/yyyy'
        title blank: false, nullable: false, matches: "[a-zA-Z0-9 ]*"
        created blank: false, nullable: false, editable: false, display: false
        updated blank: false, nullable: false, editable: false, display: false
    }

}

そして、これらのクラスを追加するサービス層のメソッド:

@Transactional
def saveCommittee(name, desc, bylaws) {
    new Committee(name: name, description: desc, bylaws: bylaws).save(flush: true);
}

@Transactional
def saveMember(fname, mname, lname, address, phone) {
    new Member(firstName: fname, middleName: mname, lastName: lname,
                 address: address, phone: phone).save(flush: true);
}

@Transactional
def saveCommitteeMember(cname, lname, fname, title, start, end) {
    def cmem = new CommitteeMember(title: title, startDate: start, endDate: end);
    cmem.member = Member.findByLastNameAndFirstName(lname, fname);
    cmem.committee = Committee.findByName(cname);
    cmem.save(flush: true);
}

これらのクラスの作成は機能し、データベースに保存されます。私の update メソッドと delete メソッドは、メンバーと委員会にとって非常に効果的です。しかし、私が何かしようとすると

//this works
def cm = CommitteeMember.get(1);
def title = cm.title;

//this does not
def firstName = cm.member.firstName;

委員会メンバーが参照するメンバーのどのフィールドにもアクセスできません。ここで何が間違っていますか?私は多くの研究を行ってきましたが、これとまったく同じものを見つけることができません。助けていただければ幸いです。この事の上に私の髪を引っ張る..

**アップデート

サービス層のメソッドsaveCommitteeMember()に行を追加しprintln(cmem.member.firstName);、grails を起動しているターミナルで、関数を呼び出したときに委員会に追加したメンバーの名前を実際に出力します。

4

1 に答える 1

0

イエス。私はついにそれを理解しました。わかりました、これが何が起こっていたかです。Hibernate は動作しfindByFirstNameAndLastName()、正常に動作しますが、grails はデフォルトで LAZY であるため、テーブル内のデータのオブジェクト表現ではなく、その Member オブジェクトへの REFERENCE のみを返します。この参照は関数が戻るときに破棄され、CommitteeMember オブジェクトはメンバー フィールドが何も指していない状態で残されます。LazyInitializationException - no session existsVaadin プラグインを使用すると、@Transactionから何かを明示的に参照しようとしない限り、そのエラー メッセージが表示されないため、これは特に優れています。def fname = cm.member.firstName@Transaction は成功と見なされたため、上記の例外をスローしていませんでした。単に null 値を読み込もうとしていたため、エラーが発生した関数の終了以外にエラー メッセージは表示されませんでした。いくつかの深刻な雄牛について話してください#$&%!

とにかく、このばかげた問題を修正するには、null の問題が発生しているオブジェクトにこれを追加します

class CommitteeMember {

    Member member
    Committee committee
    etc......

    static mapping = {
        member lazy: false
        committee lazy: false
    }

}

このような問題を抱えている他の誰かがこの投稿を見つけることを本当に願っています. これは、とてもばかげたことに多くの時間を費やしました。遅延評価は、状況によっては非常に便利です。データベース操作、IMO は、そのような状況ではありません。とにかく乾杯。

于 2012-08-22T02:09:49.980 に答える