// ======================================================================== // Copyright (C) zeroth Project Team. All rights reserved. // GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 // http://www.gnu.org/licenses/agpl-3.0.txt // ======================================================================== package zeroth.framework.enterprise.infra.persistence; import java.io.Serializable; import java.util.Collection; import java.util.Map; import javax.persistence.LockModeType; import javax.persistence.TypedQuery; import zeroth.framework.enterprise.shared.Persistable; import zeroth.framework.standard.shared.Service; /** * 基本データ永続化サービスI/F * <ul> * エンティティのライフサイクル * <li>New(新規)…インスタンス化しただけの状態。[persist()でManaged化]</li> * <li>Managed(管理)…永続コンテキスト中で管理している状態。[find()が可能]</li> * <li>Removed(削除)…永続コンテキスト中で削除を予約している状態。[remove()した後]</li> * <li>Detached(分離)…永続コンテキストから分離した状態。[merge()でManaged化]</li> * </ul> * @param <E> エンティティ型 * @param <ID> 識別子オブジェクト型 * @author nilcy */ public interface SimplePersistenceService<E extends Persistable<ID>, ID extends Serializable> extends Service { /** * 管理エンティティの永続化 * <p> * エンティティ状態の遷移は「新規→管理、削除→管理、管理→(無視)」となる。分離のとき EntityExistsException 例外を発生する。 * </p> * @param entity エンティティ */ <S extends E> void persist(S entity); /** * 管理エンティティのID検索 * @param id 識別子 * @return 管理エンティティ */ E find(ID id); /** * 管理エンティティのID検索 * @param id 識別子 * @param lockModeType ロックモードタイプ * @return 管理エンティティ */ E find(ID id, LockModeType lockModeType); /** * 管理エンティティのID検索 * @param id 識別子 * @param properties プロパティ * @return 管理エンティティ */ E find(final ID id, final Map<String, Object> properties); /** * 管理エンティティのID検索 * @param id 識別子 * @param lockModeType ロックモードタイプ * @param properties プロパティ * @return 管理エンティティ */ E find(ID id, LockModeType lockModeType, final Map<String, Object> properties); /** * 分離エンティティの永続化 * <p> * エンティティ状態の遷移は「新規→管理、管理→(無視)、分離→管理」となる。削除のとき IllegalArgumentException 例外を発生する。 * </p> * @param entity 分離エンティティ * @return 管理エンティティ */ <S extends E> S merge(S entity); /** * 管理エンティティの削除 * <p> * エンティティ状態の遷移は「新規→(無視)、管理→削除、削除→(無視)」となる。分離のとき IllegalArgumentException 例外を発生する。 * </p> * @param entity 管理エンティティ */ void remove(E entity); /** * 管理エンティティの更新 * @param entity 管理エンティティ */ void refresh(final E entity); /** * 管理エンティティの更新 * @param entity 管理エンティティ * @param lockModeType 保護モード */ void refresh(final E entity, final LockModeType lockModeType); /** * 管理エンティティの更新 * @param entity 管理エンティティ * @param properties プロパティ */ void refresh(final E entity, final Map<String, Object> properties); /** * 管理エンティティの更新 * @param entity 管理エンティティ * @param lockModeType 保護モード * @param properties プロパティ */ void refresh(final E entity, final LockModeType lockModeType, final Map<String, Object> properties); /** * 管理エンティティの保護 * @param entity 管理エンティティ * @param lockModeType 保護モード */ void lock(final E entity, LockModeType lockModeType); /** * 管理エンティティの保護 * @param entity 管理エンティティ * @param lockModeType 保護モード * @param properties プロパティ */ void lock(final E entity, LockModeType lockModeType, final Map<String, Object> properties); /** 管理エンティティのDB反映 */ void flush(); /** * 管理エンティティの分離 * @param entity 管理エンティティ */ void detach(E entity); /** * 管理エンティティ含有の確認 * @param entity エンティティ * @return 含有するとき真。含有しないとき偽。 */ boolean contains(final E entity); /** * 範囲指定クエリの作成 * @param query クエリ * @param offset 開始位置 * @param maxsize 最大件数 * @return クエリ */ TypedQuery<E> createRangeQuery(final TypedQuery<E> query, final int offset, final int maxsize); /** * 管理エンティティ集合のクエリ検索 * @param query クエリ * @return 管理エンティティ集合 */ Collection<E> findMany(TypedQuery<E> query); /** * 管理エンティティのクエリ検索 * @param query クエリ * @return 管理エンティティ */ E findOne(TypedQuery<E> query); /** * プロパティの取得 * @return プロパティ */ Map<String, Object> getProperties(); /** * プロパティの設定 * @param propertyName プロパティ名 * @param value プロパティ値 */ void setProperty(String propertyName, Object value); }