我知道这个问题已经被问过好几次了。但我相信我有一个非常不同的情况,我目前在调用 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() 时?