1

これは簡単な作業のはずですが、うまくいきません。

単一の Hibernate セッションで維持される、メイン エンティティ (Cat と呼びましょう) からぶら下がっている遅延ロードされたコレクション (子猫と呼びましょう) への変更を元に戻せるようにしたいと考えています。

コレクションは次のように定義されています (私の退屈なエンティティを猫と子猫に置き換えます):

@Entity
@Table(name="CAT")
public class Cat {

    private Map<Long, Kitten> kittens;

    @OneToMany(fetch=FetchType.LAZY, mappedBy="mother", cascade={CascadeType.ALL})
    @MapKey(name="id")
    public Map<Long, Kitten> getKittens() {
        return kittens;
    }

    ...
}

@Entity
@Table(name="KITTEN")
public class Kitten {

   private Cat mother;

    @ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CadcadeType.MERGE)
    @JoinColumn(name="MOTHER_CAT_ID", nullable=false)
    public Cat getMother {
        return mother;
    }

    ...
}

ユーザーは、明示的に保存してセッションのフラッシュが実行されるまで保持されることなく、kittens コレクションに心ゆくまで追加および削除できます。

ただし、ユーザーが元の子猫のリストを元に戻すことを選択した場合は、データベースから再度取得する必要があります。

私は、次のパターンを使用して、子猫のコレクションを第 2 レベルのキャッシュから削除し、データベースから Cat エンティティを再取得することで、コレクションを完全に元に戻そうとしました。

public class CatDao {

    public Cat reset(Cat cat) {

        SessionFactory sessionFactory = Util.getSessionFactory();
        sessionFactory.evictCollection(Cat.class.getName() + ".kittens", cat.getId());

        Cat original = (Cat)this.session.get(Cat.class, cat.getId());
        Hibernate.initialize(original.getKittens());

        return original;
    }

    ...
}

データベースから子猫を再取得することはありません (ログで示されます)。私は何を間違っていますか?

4

1 に答える 1