gpt4 book ai didi

hibernate - Grails中的多对多关系

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

我正在使用Grails使用w / MySQL和vaadin,Spring Security和Spring Security ACL插件编写带有grails的基本Web应用程序,该插件用于管理委员会,成员以及委员会与成员之间的成员资格。所有CRUD都适用于成员和委员会,但是当我创建一个CommitteeMember对象时,它很难引用该类的Member字段来获取有关成员资格成员的信息。
这是我的类(class):

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);
}

创建这些类是可行的,并将它们存储在数据库中。我的更新和删除方法非常适合成员(member)和委员会。但是,当我尝试类似
//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的终端中,它的确打印了我在调用该函数时添加到委员会的成员的名字。

最佳答案

耶稣。我终于弄明白了。好的,这里发生了什么。 Hibernate可以执行findByFirstNameAndLastName(),并且工作正常,但是由于grails默认为LAZY,因此它仅返回对该Member对象的REFERENCE,而不返回表中数据的对象表示。当函数返回时,此引用被销毁,而CommissionMember对象的成员字段指向无内容。这特别好,因为使用Vaadin插件不会得到LazyInitializationException - no session exists或任何错误消息,除非您明确尝试引用@Transaction中的内容,所以执行def fname = cm.member.firstName不会引发所述异常,因为@事务被认为是成功的,而我只是试图读取一个空值,除了终止发生错误的函数外,它不会导致任何错误消息。谈论一些严重的公牛#$&%!

无论如何,要解决此荒谬的问题,请将其添加到您存在null问题的对象中

class CommitteeMember {

Member member
Committee committee
etc......

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

}

我真的希望其他人遇到这样的问题。这让我花了很多时间在如此荒谬的事情上。在某些情况下,惰性评估非常好。 IMO数据库操作不是这种情况。无论如何,欢呼。

关于hibernate - Grails中的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12065151/

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