gpt4 book ai didi

grails - Grails-多对多数据持久性(已编辑)

转载 作者:行者123 更新时间:2023-12-02 14:50:12 25 4
gpt4 key购买 nike

好的,我迷路了...我有一个域类StudentCourse。设置了Course类。我没有在表中添加任何新类(class)。一个学生可以有很多类(class),一个类(class)可以有很多学生。请看一下我所拥有的,并指导我正确的方法。

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"
}

现在,当我输入新的学生信息时, View 不会爆炸,所以很好。。。但是它保存了学生信息,但joinTable STUDENT_COURSE为空。我知道我需要将studnet和类(class)的PK ID传递给joinTable,但是我不知道如何以及在哪里。 (它是否在 def save()下的studentController中?)
另外, .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

我的 Controller
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.

}
}

编辑2
因此,我正在考虑并进行一些研究。...除非我直接使用SQL来 STUDENT_COURSE连接表,否则我需要为 StudentCourse创建一个单独的域类,并将 StudentCourse类都映射到 StudentCourse。那是对的吗?

最佳答案

一般来说,在处理多对多关联时,您需要

  • 调用parent.addTo*(child)将实例添加到集合中,然后调用parent.save()保留它们。
  • 在两个joinTable映射中都使用key而不是column

  • 另外,我建议在调用 org.springframework.transaction.annotation.Transactional的 Controller 方法上使用 save()批注,这样您就无需显式刷新。在您的情况下, Student是关联的所有者(因为Course设置为 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 ...在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的更多信息,请创建一个新问题。

    关于grails - Grails-多对多数据持久性(已编辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34320126/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com