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;    
}

私の問題は、サービスがあることです: getAccounts を呼び出す BaseService を拡張する BusinessAccountService で、次のエラーがスローされます。

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
@Column(name = "VERSION")
private Integer version;

このバージョン フィールドの初期値は 0 でなければなりません。

于 2013-06-13T08:40:04.470 に答える