// ========================================================================
// 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.domain;
import java.io.Serializable;
import java.util.Collection;
import zeroth.framework.enterprise.shared.Persistable;
import zeroth.framework.standard.domain.Repository;
/**
* 基本リポジトリI/F
* @param <E> エンティティ型
* @param <ID> 識別子オブジェクト型
* @param <F> 検索条件オブジェクト型 TODO extends ValueObject<?>
* @author nilcy
*/
public interface SimpleRepository<E extends Persistable<ID>, ID extends Serializable, F extends Serializable>
extends Repository {
/**
* エンティティ保存
* @param entity エンティティ
* @return エンティティ
* @throws ConstraintsException 制約違反キャッチ例外
*/
<S extends E> S save(S entity) throws ConstraintsException;
/**
* エンティティ保存と反映
* @param entity エンティティ
* @return エンティティ
* @throws ConstraintsException 制約違反キャッチ例外
*/
<S extends E> S saveAndFlush(S entity) throws ConstraintsException;
/**
* エンティティ一括保存
* @param entities エンティティ集合
* @return エンティティ集合
* @throws ConstraintsException 制約違反キャッチ例外
*/
<S extends E> Collection<S> save(Iterable<S> entities) throws ConstraintsException;
/**
* エンティティ削除
* @param id 識別子
* @throws ConstraintsException 制約違反キャッチ例外
*/
void delete(ID id) throws ConstraintsException;
/**
* エンティティ削除
* @param entity エンティティ
* @throws ConstraintsException 制約違反キャッチ例外
*/
<S extends E> void delete(S entity) throws ConstraintsException;
/**
* エンティティ一括削除
* @param entities エンティティ集合
* @throws ConstraintsException 制約違反キャッチ例外
*/
<S extends E> void delete(Iterable<S> entities) throws ConstraintsException;
/** エンティティ反映 */
void flush();
/**
* エンティティ検索
* @param id 識別子
* @return エンティティ
*/
E find(ID id);
/**
* 単一エンティティ検索
* <p>
* 一意制約(UK)をもとにした検索などに使用すること。
* </p>
* @param filter 検索条件
* @return エンティティ(該当オブジェクトがないときNULL)
*/
E findOne(F filter);
/**
* 複数エンティティ検索
* @param filter 検索条件
* @return 複数エンティティ(該当オブジェクトがないとき空集合)
*/
Collection<E> findMany(F filter);
/**
* エンティティ件数
* @param filter 検索条件
* @return 件数
*/
long count(F filter);
/**
* 管理エンティティ有無の確認
* @param entity エンティティ
* @return あるとき真。ないとき偽。
*/
<S extends E> boolean exists(final S entity);
}