MappingException:无法确定Type

时间:2014-01-14 00:04:08

标签: hibernate grails gorm

在这里获取Hibernate MappingException,我无法弄清楚原因。

以下是我遇到的错误:

2014/01/13 23:58:38 [] ERROR GrailsContextLoader  - Error initializing the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: com.apporder.User, at table: user_check_in_definition, for columns: [org.hibernate.mapping.Column(user)]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: com.apporder.User, at table: user_check_in_definition, for columns: [org.hibernate.mapping.Column(user)]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: com.apporder.User, at table: user_check_in_definition, for columns: [org.hibernate.mapping.Column(user)]
    ... 4 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Could not determine type for: com.apporder.User, at table: user_check_in_definition, for columns: [org.hibernate.mapping.Column(user)]
    ... 4 more
Caused by: org.hibernate.MappingException: Could not determine type for: com.apporder.User, at table: user_check_in_definition, for columns: [org.hibernate.mapping.Column(user)]
    ... 4 more

UserCheckInDefinition类:

package com.xxxx

class UserCheckInDefinition {

    static constraints = {
        daysBetweenCheckIn(inList: [1..60])
        remindDaysBefore(inList: [0,1,2,3,4,5])
        startDate(nullable: true)
        endDate(nullable: true)
        lastCheckIn(nullable: true)
        nextCheckIn(nullable: true)
        checkInAlert(nullable: true)
        missedCheckInEmailAlert(nullable: true)
    }
    static mapping = {
        id generator: 'sequence', params: [sequence: 'user_check_in_definition_id_sequence']
    }

    User user
    Boolean enabled = true
    Date startDate
    Date endDate
    Date nextCheckIn // calculated
    Date checkInAlert // calculate
    Date lastCheckIn
    Integer daysBetweenCheckIn = 7
    Integer remindDaysBefore = 1 // actual notify days after
    @Deprecated
    Boolean missedCheckInEmailAlert
}

用户类:

package com.xxxx

import com.xxxx.utils.Utilities

class User implements Serializable{
    transient springSecurityService
    static String SERVICE_TG = "TargetGraffiti"
    static String SERVICE_TG_LOCAL = "TargetGraffitiLocal"

    static constraints = {
        username(blank: false, unique: true)
        userRealName(blank: false)
        passwd(blank: false)
        enabled()
        phoneNumber(nullable: true)
        phoneNumber2(nullable: true)
        carrier(nullable: true)
        description(nullable: true)
        udid(nullable: true)
        createdByUdid(nullable: true)
        email(nullable: true)
        lastReport(nullable: true)
        owner(nullable: true)
        webservice(nullable: true, inList: [User.SERVICE_TG, User.SERVICE_TG_LOCAL])
        signature(nullable: true)
        badgeNumber(nullable: true)  // udid of unregistered user
        trackInterval(nullable: true)
        trackColor(nullable: true)
        trackIconFileName(nullable: true)
        type(nullable: true)
        userType(nullable: true)
        status(nullable: true)
        punchClockStatus(nullable: true)
        lastPunch(nullable: true)
        lastPunchDate(nullable: true)
        domainName(nullable: true)
        job(nullable: true)
        task(nullable: true)
        app(nullable: true)
        timeZone(nullable: true)
        pushRegIdAndroid(nullable: true)
        pushRegIdIphone(nullable: true)
        dev(nullable: true)
    }
    static mapping = {
        table 'user_'   // user is a postgres reserved word
        id generator: 'sequence', params: [sequence: 'user_id_sequence']
        reportType cascade: 'none'
        report cascade: 'none'
        app cascade: 'none'
        owner cascade: 'none'
        reportTypes type: 'class'
    }

    static transients = ['pass', 'passwd2', 'facetMap', 'facetMapPlus', 'authorities', 'myRecordTypes', 'myReportTypes', 'accept']
    //required
    String username
    String passwd
    String passwd2
    String userRealName

    //shared
    Date dateCreated = new Date()
    String email
    String phoneNumber // mobile number
    String phoneNumber2 // office number
    Carrier carrier
    boolean enabled = false
    boolean registered = false // citizen users are not registered, they don't know their user name and password
    boolean deleted = false // virtual delete
    String udid
    String createdByUdid // udid of phone that created the user
    Date lastReport
    TimeZone timeZone // added for Zorts
    Long qtyReports = 0

    // todo: remove tracking fields, moved to UserTrackingDefinition
    String trackInterval = "off" // in minutes
    String trackIconFileName
    String trackColor = "000000" // default black

    Long userVersion = 0 // for syncing user data to phone
    boolean saveSession = false

    //citizen
    boolean getReportUpdates = false
    boolean getNotices = false

    //web
    SortedSet applications
    static hasMany = [
            authorities: Role,
            reportTypes: ReportType,
            reportTypeSticky: ReportTypeSticky
    ]
    static belongsTo = Application
    // todo: owner is a reserved field name, this should be renamed
    Application owner // for belongs to one to many - users
    boolean emailShow
    String description = ''
    // todo: clean up the user_ table, remove these columns
    Application app // app currently or last logged into
    //    @Deprecated // replaced with owningReportPath
    //    Report owningReport // owner of reports for currently selected report type
    //    ReportType reportType // reportType currently or last chosen
    //    Report report // report currently or last chosen
    //    String facets = "" // currently selected facets as map
    //    String sort = "Newest"  // currently select sort field
    //    Long listOff = 0 // pagination offset for report list
    //    String listMode = "list" // currently selected list view mode - list, map, photos
    String webservice
    Photo signature
    String badgeNumber
    String type
    UserType userType
    @Deprecated
    String status
    PunchClockStatus punchClockStatus
    String lastPunch
    Date lastPunchDate
    Boolean accept // user accepted the privacy policy and terms and conditions
    String domainName // domain name and port for self registered users
    Boolean test = false // denotes a test user which will be deleted automatically and will not charge credit cart
    // for punch clock
    Report job
    Report task
    String pushRegIdIphone
    String pushRegIdAndroid
    Boolean dev = false // for iphone push notifications

    // migration to new Spring Security plugin
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    protected void encodePassword() {
        passwd = springSecurityService.encodePassword(passwd)
    }

    /** plain password to create a MD5 password           */
    String pass = '[secret]'

    // self registration and subscription users

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty("passwd")) {
            encodePassword()
        }
        if (username != getPersistentValue('username') ||
                userRealName != getPersistentValue('userRealName') ||
                description != getPersistentValue('description') ||
                type != getPersistentValue('type') ||
                registered != getPersistentValue('registered'))
            ++userVersion
    }

    def getAppAuthorities() {
        List ret = authorities.collect { role -> role.authority }
        return ret
    }

    String toXML() {
        StringBuilder sb = new StringBuilder()
        sb.append("<user id='${id}'>")
        sb.append(Utilities.makeElementCdata("name", userRealName))
        sb.append(Utilities.makeElement("performer", hasRole('ROLE_PERFORMER') as String)) // todo: use roles
        sb.append(Utilities.makeElement("type", type))
        sb.append(Utilities.makeElement("statusId", punchClockStatus?.id as String))
        sb.append(Utilities.makeElement("jobId", job?.id as String))
        sb.append(Utilities.makeElement("taskId", task?.id as String))
        StringBuilder sb2 = new StringBuilder()
        String comma = ""
        for (UserRole userRole : UserRole.findAllByUser(this)) {
            sb2.append(comma).append(userRole.role.authority)
            comma = ","
        }
        sb.append(Utilities.makeElementCdata("roles", sb2.toString()))
        sb.append(Utilities.makeElementCdata("filter", filter(0)))
        sb.append(Utilities.makeElementCdata("filter1", filter(1)))
        sb.append(Utilities.makeElementCdata("filter2", filter(2)))
        sb.append("</user>")
        return sb.toString()
    }

    String filter(int level) {
        StringBuilder sb2 = new StringBuilder()
        String comma = ""
        if (owner?.userFilter != null) {
            for (UserFilter uf : UserFilter.findAllByLevelAndUser(level, this)) {
                sb2.append(comma).append(uf.report.id)
                comma = ","
            }
            return sb2.toString()
        }
        return null
    }

    String exportXml() {
        StringBuilder sb = new StringBuilder()
        sb.append("<user id='${id}'>")
        sb.append(Utilities.makeElementCdata("userRealName", userRealName))
        sb.append(Utilities.makeElement("type", type))
        sb.append(Utilities.makeElement("username", username))
        sb.append(Utilities.makeElement("email", email))
        sb.append(Utilities.makeElement("phoneNumber", phoneNumber))
        sb.append(Utilities.makeElement("getReportUpdates", getReportUpdates))
        sb.append(Utilities.makeElement("getNotices", getNotices))
        sb.append(Utilities.makeElement("dateCreated", dateCreated?.toString()))
        sb.append(Utilities.makeElementCdata("carrier", carrier?.name))
        sb.append(Utilities.makeElement("deleted", deleted))
        sb.append(Utilities.makeElement("udid", udid))
        sb.append(Utilities.makeElement("createdByUdid", createdByUdid))
        sb.append(Utilities.makeElement("enabled", enabled))
        sb.append("<roles>")
        for (UserRole userRole : UserRole.findAllByUser(this)) {
            sb.append(Utilities.makeElement("role", userRole.role.authority))
        }
        sb.append("</roles>")
        if (owner?.userFilter != null) {
            sb.append("<userFilter>")
            for (UserFilter uf : UserFilter.findAllByUser(this)) {
                sb.append(Utilities.makeElement("id", uf.report.id))
            }
            sb.append("</userFilter>")
        }
        sb.append("</user>\r\n")
        return sb.toString()
    }

    boolean hasRole(String role) {
        return getAppAuthorities().contains(role)
    }

    Set<Role> getAuthorities() {
        if (id == null) return []
        if (userType != null)
            return userType.authorities
        else
            return UserRole.findAllByUser(this).collect { it.role } as Set
    }

    String username(String server) {
        String ret = username
        if (server == "saveyourbooty.com" || server == "www.saveyourbooty.com") {
            ret = username.replace("SYB:", "")
        }
        return ret
    }

    void decorateUsername(String server) {
        if (server == "saveyourbooty.com" || server == "www.saveyourbooty.com") {
            username = "SYB:${username}"
        }
    }

    boolean hasReportType(ReportType reportType) {
        boolean ret = false
        for (ReportType rt : reportTypes) {
            if (rt.id == reportType.id) {
                ret = true
                break
            }
        }
        return ret
    }

    TimeZone timeZone() {
        if (timeZone != null)
            return timeZone
        return owner.timeZone ?: TimeZone.default
    }

}

我对Hibernate很新,不知道为什么会导致问题。 如果您需要其他信息,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:3)

我想出来了。 问题是依赖性问题。我需要Grails的postgresql扩展来从postgresql数据库中读取数据类型。

BuildConfig中有这个诀窍:

compile ":postgresql-extensions:0.6.1"

答案 1 :(得分:0)

似乎Hibernate很难理解UserCheckInDefinition和User之间的关系。如果他们是一对多,你有相应的设置关系吗?

答案 2 :(得分:0)

您确定您的User类是域类,即它是否位于grails-app/domain目录下?如果是,您是否可以更新您的问题以显示User类?