0

いくつかのモデル クラスのコードを、フィールド アクセサーからプロパティ アクセサーに変更しました。また、順序は重要ではないため、List から Set に変更しました。以下は私のエンティティクラスです。

@Entity
@Table(name = "TPYP_GAME")
public class Game extends AbstractGeneratedIdEntity{
    private static final long serialVersionUID = -1390767030654384142L;

    private static final String GAME_FIELD = "GAME";

    private GameypeEnum gameTypeEnum;    
    private Set<GameCode> gameCodes;    

    @Transient
    public GameTypeEnum getGameTypeEnum() {
        return gameTypeEnum;
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy = GAME_FIELD, fetch = FetchType.LAZY)
    public Set<GameCode> getGameCodes() {
        return gameCodes;
    }

    public void setGameTypeEnum(GameTypeEnum gameTypeEnum) {
        this.gameTypeEnum = gameTypeEnum;
    }

    public void setGameCodes(Set<GameCode> gameCodes) {
        this.gameCodes = gameCodes;
    }

ソースコードをデバッグしたところ、リポジトリからデータを取得した後にトランザクションをコミットすると、次の例外がスローされることがわかりました。

 org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction;
 nested exception is javax.persistence.RollbackException: Error while committing the transaction
 javax.persistence.RollbackException: Error while committing the transaction java.util.HashSet 
 cannot be cast to org.hibernate.collection.PersistentCollection

修正方法がわかりません。私は何が欠けていますか?


クライアントコード:

    @Transactional(readOnly = true) 
    public List<Game> getGames(String nameContains, Long pageSize){ 
    if(!nameContains.isEmpty() && pageSize !=null){ 
    return repository.findAll(nameIsLike(nameContains), constructPageSpecification(pageSize)).getContent(); }
    else{ if(pageSize != null){ 
    return repository.findAll(null, constructPageSpecification(pageSize)).getContent(); }
    else if(!nameContains.isEmpty()){ 
    return repository.findAll(nameIsLike(nameContains)); }else{ return repository.findAll(); 
}
 }
     }
4

1 に答える 1

2

データベースからの読み取りを、既存のものに追加または削除するのではなく、新しく作成されたものsetGameCodesに置き換えているように見えます。これにより、変更を DB にコミットしようとすると問題が発生します。SetHashSet

setGameCodesやるべきかも

this.gameCodes.clear();
this.gameCodes.addAll(gameCodes);

それ以外の

this.gameCodes = gameCodes;
于 2013-09-11T15:31:43.447 に答える