1

わかりました、道に迷ってしまいました... ドメイン クラスStudentCourse. クラスCourseが設定されます。テーブルに新しいコースを追加しません。学生は多くのコースを持つことができ、コースは多くの学生を持つことができます。私が持っているものを見て、私を正しい道に導いてください。

class Student {
    String fullName

    static belongsTo = [schools: School]
    static hasMany = [courses:Course]

    static mapping = {
        table "STUDENT"
        courses joinTable: "STUDENT_COURSE", key: "COURSE_ID"  
}

class Course {
    String courseName   

    static hasMany = [students:Student]
    static belongsTo = Student

    static mapping = {
        students joinTable: "STUDENT_COURSE", key: "STUDENT_ID"
}

これで、新入生情報を入力すると、ビューが爆破されないので、それでいいのですが、学生情報は保存されますが、joinTableSTUDENT_COURSEは空白です。どういうわけか、Studnet とコースの PK ID を joinTable に渡す必要があることはわかっていますが、方法と場所がわかりません。(studentController の下に入っていdef save()ますか?) また、どの.gspように見えるでしょうか? これは私が持っているものであり、私はそれが間違っていることを知っています.(id="coursetags" is jQuery autocomplete id)

私の_form.gsp入力部分。

<div class="fieldcontain ${hasErrors(bean: studentInstance, field: 'courses', 'error')} required" >
<label for="course">
    <g:message code="student.courses.label" default="Course" />
    <span class="required-indicator">*</span>
</label>
<g:textField name="course" id="coursetags" required="" value="${course?.course}"/>

私の結果は次のようになります。

STUDENT             COURSE                      STUDENT_COURSE
ID      FULLNAME    ID          COURSENAME      STUDENT_ID   COURSE_ID
1       John Doe    1           English101        1             1
2       Jane Smith  2           Science101        1             2
                                                  2             2

私はこれらのサイトを分析しようとしています...

http://chrisbroadfoot.id.au/2008/07/19/many-to-many-relationship-mapping-with-gorm-grails/

https://grails.github.io/grails-doc/3.0.x/guide/GORM.html#manyToMany

https://grails.org/wiki/Many-to-Many%20Mapping%20without%20Hibernate%20XML

ありがとうございました。

編集1

私のコントローラー

class studentController {
    @Transactional
    def save(Student studentInstance) {
        if (studentInstance == null) {
            notFound()
            return
        }

        if (studentInstance.hasErrors()) {
            respond studentInstance.errors, view:'create'
            return
        }  

    def courseID = Course.findByCourseLike(params.course)

    studnetInstance.save flush:true

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.created.message', args: [message(code: 'student.label', default: 'Student'), studnetInstance.id])
            redirect studentInstance
        }
        '*' { respond studentInstance, [status: CREATED] }
    }

    def sID = studentInstance.id    //When I println under these, they print the right id numbers.
    def cID = courseID.id

    student.addToCourses(cID).save()  //This is the part that I don't understand.
                                     //I get error saying No such property: student for class.

    }
}

EDIT 2 だから、私はいくつかの研究を考えていました.... SQLを直接使用してSTUDENT_COURSEテーブルを結合しない限り、別のドメインクラスを作成し、とクラスのStudentCourse両方を にマップする必要があります。あれは正しいですか?StudentCourseStudentCourse

4

1 に答える 1

0

一般的に言えば、多対多の関連付けを扱うときは、

  1. を呼び出しparent.addTo*(child)てインスタンスをコレクションに追加してから、parent.save()それらを永続化するために呼び出します。
  2. 両方のjoinTableマッピングでkey代わりに使用します。column

さらに、明示的にフラッシュする必要がないように、org.springframework.transaction.annotation.Transactional呼び出すコントローラー メソッドでアノテーションを使用することをお勧めします。save()あなたの場合、Studentは関連付けの所有者です (コースが に設定されているためbelongTo Student)。

import org.springframework.transaction.annotation.Transactional

class StudentController {

    @Transactional
    def save() {
        def student = /* some Student instance */
        def course = /* some Course instance */

        student.addToCourses(course)
        student.save()
    }
}

基本的に、addTo*()メソッドは結合テーブルを処理します。

GSP

そのため、永続性が考慮されます。GSPに関しては... StackOverflowでは、一度に複数の質問をすることは嫌われています。しかし、最小限の HTML/GSP を使用した一般的な考え方は次のとおりです。

<g:each var="student" in="${students}">
  <g:each var="course" in="${student.courses}">
    <p>${student.id}  ${student.fullName}  ${course.id}  ${course.courseName}</p>
  </g:each>
</g:each>

GSP の詳細については、新しい質問を作成してください。

于 2015-12-16T21:35:28.893 に答える