Spring Grails TransientObject异常

Spring Grails TransientObject异常,spring,grails,ldap,Spring,Grails,Ldap,这与我的配置有关,你可以在这里找到我的配置。ldap用户被映射到数据库用户表,并且条目被很好地创建。然后userDetails尝试从主用户类获取权限,导致以下异常: 2014-01-31 12:10:52,076 [http-bio-8111-exec-4] ERROR [/step].[default] - Servlet.service() for servlet [default] in context with path [/step] threw exception Message:

这与我的配置有关,你可以在这里找到我的配置。ldap用户被映射到数据库用户表,并且条目被很好地创建。然后userDetails尝试从主用户类获取权限,导致以下异常:

2014-01-31 12:10:52,076 [http-bio-8111-exec-4] ERROR [/step].[default]  - Servlet.service() for servlet [default] in context with path [/step] threw exception
Message: object references an unsaved transient instance - save the transient instance before flushing: packagae.User; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: package.User
    Line | Method
->>  102 | doCall                in org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     42 | getAuthorities        in package.User
|     27 | getAuthorities . . .  in package.MdtUserDetails
|     72 | attemptAuthentication in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
|     49 | doFilter . . . . . .  in     ''
|     82 | doFilter              in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|   1145 | runWorker . . . . . . in java.util.concurrent.ThreadPoolExecutor
|    615 | run                   in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run . . . . . . . . . in java.lang.Thread
Caused by TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: package.User
->>  102 | doCall                in org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     42 | getAuthorities        in package.User
|     27 | getAuthorities . . .  in package.MdtUserDetails
|     72 | attemptAuthentication in grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
|     49 | doFilter . . . . . .  in     ''
|     82 | doFilter              in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|   1145 | runWorker . . . . . . in java.util.concurrent.ThreadPoolExecutor
|    615 | run                   in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run . . . . . . . . . in java.lang.Thread
以下是我的用户详细信息类:

import java.util.Collection;

import org.springframework.security.core.GrantedAuthority
import org.springframework.security.ldap.userdetails.LdapUserDetails

import package.Role
import package.User

class MdtUserDetails extends User implements LdapUserDetails{



    public MdtUserDetails(String fullName, String email, String username, String password, boolean enabled, boolean accountExpired,
        boolean accountLocked, boolean passwordExpired, Collection<GrantedAuthority> authorities) {
        super(username: username, password: password, email: email, fullName: fullName, enabled: enabled, accountExpired: accountExpired, accountLocked: accountLocked, passwordExpired: passwordExpired, authorties: authorities)

    }


    @Override 
    public Set<Role> getAuthorities(){
        return super.getAuthorities()
    }

    @Override
    public boolean isAccountNonExpired() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public String getDn() {
        // TODO Auto-generated method stub
        return null;
    }


}
相反,我需要从这里扩展springsecurity用户类:

import org.springframework.security.core.userdetails.User
我相信这是导致我的暂时对象异常的原因,因为答案表明你需要有belongsTo,等等。我的类中确实有这些

Caused by TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: package.User
此消息告诉您,要保存的
用户
对象至少包含一个对另一个未保存域对象的引用

根据您的
用户
类,此未保存的引用可以是
报告
发票
对象。 您可以使用以下选项来解决此问题:

在将报告和发票添加到用户之前手动保存它们

使用启用报表和发票的自动级联

static mapping = {
  reports cascade: 'all-delete-orphan'
  reports invoices: 'all-delete-orphan'
}

项下的
关系添加到
发票和
报告中

static belongsTo = [user: User]

谢谢你的建议。我已经有了属于我的关系。我尝试将“全部删除孤立项”级联到用户的类中,但没有成功。
User
中的
password
映射到哪个列?它只是映射到password。用户表映射到步骤\用户。
static mapping = {
  reports cascade: 'all-delete-orphan'
  reports invoices: 'all-delete-orphan'
}
static belongsTo = [user: User]