在grails中保存具有多对多关系的对象
发布时间:2020-12-14 16:29:23 所属栏目:大数据 来源:网络整理
导读:我正在尝试保存具有很多关系的对象. SellingCompany可以拥有多个账户,账户可以与许多销售公司相关联.因此,存储在SellingCompaniesAccount中的表之间存在许多关系 我的Account_Info域名如下: class AccountInfo { static mapping ={ table 'AccountInfo' ver
我正在尝试保存具有很多关系的对象. SellingCompany可以拥有多个账户,账户可以与许多销售公司相关联.因此,存储在SellingCompaniesAccount中的表之间存在许多关系
我的Account_Info域名如下: class AccountInfo { static mapping ={ table 'AccountInfo' version false //id column:'accountInfoID' } String evi_pass_phrase String evi_username String security_key // to make sure fields show up in a particular order static constraints = { //accountInfoID(insert:false,update:false) evi_pass_phrase() evi_username() security_key() } static hasMany = [sellingcompaniesaccount:SellingCompaniesAccount] String toString() { return "${evi_username}" } } 我的SellingComapanies域名如下: class SellingCompanies { static mapping = { table 'SellingCompanies' version false } String name //static belongsTo = AccountInfo //static hasMany = [accounts: AccountInfo] static hasMany = [sellingcompaniesaccount:SellingCompaniesAccount] static constraints = { name(blank:false,validator: { val,obj -> def similarSellingCompanies = SellingCompanies.findByNameIlike(val) return !similarSellingCompanies || (obj.id == similarSellingCompanies.id) }) } //String toString() { name } } 包含Many-Many关系的表如下: class SellingCompaniesAccount { static constraints = { // ensure the group of sellingCompaneis and accountInfo values are unique agency_name(unique:['sellingCompanies','accountInfo']) } int agency_id String agency_name String consultant_id String code Boolean isActive String iata ContactInfo contactinfo static belongsTo = [sellingCompanies:SellingCompanies,accountInfo:AccountInfo] } } create.gsp文件中的表单包含实际迭代所有不同SellingCompanies的代码,并显示为复选框. <g:form action="save" method="post"> <div class="dialog"> <table width="500px" border="0px" color="red"> <tbody> <tr class="prop"> <td valign="top" class="name"><label for="accountInfo"><g:message code="sellingCompaniesAccount.accountInfo.label" default="Account Info" /></label></td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'accountInfo','errors')}"> <g:select name="accountInfo.id" from="${content_hub_admin.AccountInfo.list()}" optionKey="id" value="${sellingCompaniesAccountInstance?.accountInfo?.id}" /></td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="sellingCompanies"><g:message code="sellingCompaniesAccount.sellingCompanies.label" default="Selling Companies" /></label></td> <td valign="top" class=""> <g:each in="${content_hub_admin.SellingCompanies.list()}" var="item" status="i"> ${++i}. ${item.name} <g:checkBox name="sellingcompanies_${++i-1}" optionKey="id" value="${item.id}" /> <br> </g:each> <!-- end here by rsheyeah --> </td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="code"><g:message code="sellingCompaniesAccount.code.label" default="Code" /></label></td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'code','errors')}"> <g:textField name="code" value="${sellingCompaniesAccountInstance?.code}" /></td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="agency_name"><g:message code="sellingCompaniesAccount.agency_name.label" default="Agencyname" /></label></td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'agency_name','errors')}"> <g:textField name="agency_name" value="${sellingCompaniesAccountInstance?.agency_name}" /></td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="isActive"><g:message code="sellingCompaniesAccount.isActive.label" default="Is Active" /></label> </td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'isActive','errors')}"> <g:checkBox name="isActive" value="${sellingCompaniesAccountInstance?.isActive}" /></td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="agency_id"><g:message code="sellingCompaniesAccount.agency_id.label" default="Agencyid" /></label> </td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'agency_id','errors')}"> <g:textField name="agency_id" value="${fieldValue(bean: sellingCompaniesAccountInstance,field: 'agency_id')}" /> </td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="iata"><g:message code="sellingCompaniesAccount.iata.label" default="Iata" /></label></td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'iata','errors')}"> <g:textField name="iata" value="${sellingCompaniesAccountInstance?.iata}" /></td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="consultant_id"><g:message code="sellingCompaniesAccount.consultant_id.label" default="Consultantid" /></label></td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'consultant_id','errors')}"> <g:textField name="consultant_id" value="${sellingCompaniesAccountInstance?.consultant_id}" /></td> </tr> <tr class="prop"> <td valign="top" class="name"><label for="contactinfo"><g:message code="sellingCompaniesAccount.contactinfo.label" default="Contactinfo" /></label></td> <td valign="top" class="value ${hasErrors(bean: sellingCompaniesAccountInstance,field: 'contactinfo','errors')}"> <g:select name="contactinfo.id" from="${content_hub_admin.ContactInfo.list()}" optionKey="id" value="${sellingCompaniesAccountInstance?.contactinfo?.id}" /></td> </tr> </tbody> </table> </div> <div class="buttons"><span class="button"><g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label',default: 'Create')}" /></span> </div> </g:form> 最后是处理保存和列表功能的控制器. class SellingCompaniesAccountController { private static Logger log = Logger.getLogger(SellingCompaniesAccountController.class) //def index = { } //def scaffold = true def index = { redirect(action:list,params:params) } //To limit access to controller actions based on the HTTP request method. def allowedMethods = [save:'POST'] //create.gsp exists def create = { render(view:"create") } //edit.gsp exists //def edit = {} //list.gsp exists def list = { [ sellingCompaniesAccountInstanceList: SellingCompaniesAccount.list( max:15) ] } //show.gsp exists //def show={} //save.gsp exists def save = { log.info "Saving: " + params.toString() println("Saving: " + params.toString()) def sellingCompaniesAccount = params.sellingCompaniesAccount println(sellingCompaniesAccount) def sellingCompanies = params.sellingCompanies log.info "sellingCompanies: " + sellingCompanies println(sellingCompanies) def sellingCompaniesAccountInstance = new SellingCompaniesAccount(name: params.name) println(params.name) params.each { if (it.key.contains("_sellingcompanies")) //sellingCompaniesAccountInstance.sellingCompaniesId << SellingCompanies.get((it.key - "sellingcompanies_") as Integer) if (it.key.contains("sellingcompanies_")) sellingCompaniesAccountInstance.sellingCompaniesId << SellingCompanies.get((it.key - "sellingcompanies_") as Integer) } log.info sellingCompaniesAccountInstance if (sellingCompaniesAccountInstance.save(flush: true)) { flash.message = "${message(code: 'default.created.message',args: [message(code: 'sellingCompaniesAccountInstance.label',default: 'sellingCompaniesAccountInstance'),sellingCompaniesAccountInstance.id])}" redirect(action: "show",id: sellingCompaniesAccountInstance.id) log.info sellingCompaniesAccountInstance } else { render(view: "create",model: [sellingCompaniesAccountInstance: sellingCompaniesAccountInstance]) } } } 现在,我收到以下错误,因为空的隐藏值出现像_sellingcompanies_1等: 错误日志: Saving: ["accountInfo.id":"1","accountInfo":["id":"1"],"_sellingcompanies_5":"","_isActive":"","code":"test","agency_name":"test","sellingcompanies_4":"4","sellingcompanies_5":"5","create":"Create","isActive":"on","iata":"test","agency_id":"test","contactinfo.id":"1","contactinfo":["id":"1"],"consultant_id":"test","sellingcompanies_2":"2","_sellingcompanies_1":"","sellingcompanies_3":"3","_sellingcompanies_2":"","_sellingcompanies_3":"","sellingcompanies_1":"1","_sellingcompanies_4":"","action":"save","controller":"sellingCompaniesAccount"] null null null 2011-03-15 17:13:44,620 [http-8080-2] ERROR org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver - For input string: "_5" java.lang.NumberFormatException: For input string: "_5" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Integer.valueOf(Integer.java:554) at content_hub_admin.SellingCompaniesAccountController$_closure4_closure5.doCall(content_hub_admin.SellingCompaniesAccountController:70) at content_hub_admin.SellingCompaniesAccountController$_closure4.doCall(content_hub_admin.SellingCompaniesAccountController:66) at content_hub_admin.SellingCompaniesAccountController$_closure4.doCall(content_hub_admin.SellingCompaniesAccountController) at java.lang.Thread.run(Thread.java:680) 首先,隐藏值来自哪里,这种方法可以很好地提交SellingCompaniesAccount控制器类中的Many-Many关系信息.这样做的任何更好的技巧. create.gsp在浏览器中解析为: 提前致谢 解决方法
如果其他人遇到同样的问题,那么丹尼尔的上述答案绝对正确,只是在Grails 2.7.8中添加了一些变化
所有复选框都具有相同的值=“${item.id}”和name =“sellingcompanies”,如下所示 – <!-- ... snip ... --> <tr class="prop"> <td valign="top" class="name"><label for="sellingCompanies"><g:message code="sellingCompaniesAccount.sellingCompanies.label" default="Selling Companies" /></label></td> <td valign="top" class=""> <g:each in="${content_hub_admin.SellingCompanies.list()}" var="item" status="i"> ${++i}. ${item.name} <g:checkBox name="sellingcompanies" optionKey="id" value="${item.id}" /> <br> </g:each> <!-- end here by rsheyeah --> </td> </tr> <!-- ... snip ... --> 最好的部分是,在目前版本的grails中,你不需要像Daniel所提到的那样使用“flatten()as string”这些值将自动由grails处理并将保存在连接表中.您需要确保的是,您的复选框具有正确的名称和值. 希望能帮助到你!! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |