私のアプリケーションは DAO パターンを使用しています。実装メソッドを「静的」にする必要がありますか?
私はこの具体的な実装について話している:
- findByIdentifier(文字列識別子)
しかし、ジェネリック実装についても:
- E getByID(K ID);
- リストfindAll();
- 保存 (E エンティティ);
- 更新 (E エンティティ);
- 削除 (E エンティティ);
アドバイスありがとう!
public interface DaoBase<K, E> {
E getByID(K ID);
List<E> findAll();
void save(E entity);
void update(E entity);
void delete(E entity);
}
public interface DaoLanguage extends DaoBase<Long, LanguageEntity> {
LanguageEntity findByIdentifier(String identifier);
}
JPA を使用してすべてのエンティティ クラスを永続化しています。
public class JpaDaoLanguage extends JpaDaoBase<Long, LanguageEntity> implements DaoLanguage {
public LanguageEntity findByIdentifier(String identifier) {
LanguageEntity language = (LanguageEntity) entityManager.createQuery(
"select lan from LanguageEntity as lan where lan.identifier = ?1")
.setParameter(1, identifier)
.getSingleResult();
return language;
}
}
汎用ベースの実装
public abstract class JpaDaoBase<K, E> implements DaoBase<K, E> {
protected EntityManager entityManager;
protected Class<E> entityClass;
@SuppressWarnings("unchecked")
public JpaDaoBase() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass
.getActualTypeArguments()[1];
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("CyberLabPersistenceUnit");
entityManager = factory.createEntityManager();
}
@Override
public E getByID(K ID) {
return entityManager.find(entityClass, ID);
}
@SuppressWarnings("unchecked")
@Override
public List<E> findAll() {
Query q = entityManager.createQuery("SELECT e FROM "
+ entityClass.getName() + " e ");
return (List<E>) q.getResultList();
}
@Override
public void save(E entity) {
entityManager.persist(entity);
}
@Override
public void update(E entity) {
entityManager.merge(entity);
}
@Override
public void delete(E entity) {
entityManager.remove(entity);
}
}