0

我知道这个问题已经被问过好几次了。但我相信我有一个非常不同的情况,我目前在调用 getResultList() 方法时遇到了这个错误,而不是在持久化时。

请注意,我正在使用:-javaee6 -seam3-security -jboss7.1.3 -postgresql

一系列事件: 1.) 登录后,我使用接口 org.picketlink.idm.api.User 将我的用户保存在 picketlink 中:

setUser(new MyUser(user));

我应该能够使用 ((MyUser)identity.getuser()).getUser(); 检索用户

2.) 现在我有一个与 AccounType 有 OneToMany 关系的 BusinessAccount 实体:

@Entity
@Table(name = "T_ACCOUNT")
public class BusinessAccount extends BaseEntity {
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "ACCOUNT_TYPE_ID")
    private AccountType accountType;
}

@Entity()
@Table(name = "T_ACCOUNT_TYPE")
public class AccountType extends BaseEntity {   
    @Enumerated(EnumType.STRING)
    @Column(name = "ACCOUNT_TYPE", length = 20) 
    private AccountTypeEnum accountTypeEnum;    
}

我的问题是我有一个服务:扩展 BaseService 的 BusinessAccountService,它调用 getAccounts 并引发此错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

BaseService 有:

public User getCurrentUser() {
    if(currentUser==null){
     try {
         currentUser=((MyUser) identity.getUser()).getUser();
     } catch(Exception e){
         log.warn("getCurrentUser cannot retrieve current user from session identity and currentUser has not been set programmatically");
     }
    }
    return currentUser;
}

然后我动态生成的查询是这样的:

select distinct a from BusinessAccount a where a.accountType.accountTypeEnum=:a_accountType_accountTypeEnum and (a.accountType in (:a_accountType0)) 

Param name:a_accountType_accountTypeEnum value:serviceProvider 

Param name:a_accountType0 value:[org.model.accounts.AccountType@1, org.model.accounts.AccountType@2]

我发现这条线抛出了错误:

and (a.accountType in (:a_accountType0)) 

这是为什么?当我只执行 getResultList() 时?

4

1 回答 1

0

我想我找到了问题,AccountType 正在扩展一个具有 Version 字段的 BaseEntity。当我在 AccountType 中删除扩展并添加 Version 属性时,我得到了同样的错误。

版本字段:

@Version
@Column(name = "VERSION")
private Integer version;

此版本字段的初始值必须为 0。

于 2013-06-13T08:40:04.470 回答