単テーブルにおけるデータ追加¶
CriteriaAPIを使用したデータ追加¶
単テーブルにおいてINSERTを実施する場合は、JPAのCriteria APIを使用して実装する。 GenericDaoの様に共通化したメソッドを経由して実行するとよい。
例) ユーザデータのみを追加する場合
test-javaee6-ejb org.debugroom.test.domain.service.impl.ejb.dbaccess.SimpleInsertService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package org.debugroom.test.domain.service.impl.ejb.dbaccess;
import java.util.Date;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.debugroom.framework.common.exception.BusinessException;
import org.debugroom.test.domain.model.User;
import org.debugroom.test.domain.repository.UserRepository;
import org.debugroom.test.domain.service.dbaccess.SimpleInsertService;
@Stateless
public class SimpleInsertServiceImpl implements SimpleInsertService{
@EJB
UserRepository userRepository;
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public User saveUser(User user) throws BusinessException {
//新規追加するユーザのデータを作成する。IDは現在のデータ件数に+1して、8桁に0パディングして作成する。
Long numberOfUser = userRepository.count();
String idFormat = new StringBuilder()
.append("00000000")
.append(numberOfUser)
.toString();
user.setUserId(idFormat.substring(idFormat.length() - 8, idFormat.length()));
user.setLastUpdatedDateAndTime(new Date());
// 既にユーザが存在している場合は、業務例外の仕様とする。(いったん対象のユーザを削除させる)
if(!userRepository.save(user)){
throw new BusinessException("E-0001");
}
return user;
}
}
|
test-javaee6-ejb org.debugroom.test.domain.repository.impl.jpa.UserRepositoryImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package org.debugroom.test.domain.repository.impl.jpa;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import org.debugroom.test.domain.model.User;
import org.debugroom.test.domain.repository.UserRepository;
// トランザクションの管理はEJBに任せて、Stateless Session Beanとして実装する。
// Serviceから呼ばれるため、トランザクションの伝播属性を一応、REQUIREDにしておく。(デフォルトも多分REQUIREDだと思うが)
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserRepositoryImpl extends GenericDaoImpl<User, String> implements UserRepository{
@Override
public boolean save(User user) {
if(entityManager.contains(user)){
return false;
}
//
entityManager.persist(user);
return true;
}
|
test-javaee6-ejb org.debugroom.test.domain.repository.impl.jpa.GenericDaoImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | package org.debugroom.test.domain.repository.impl.jpa;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.debugroom.test.domain.repository.GenericDao;
@SuppressWarnings("unchecked")
public abstract class GenericDaoImpl<T extends Serializable, ID extends Serializable>
implements GenericDao<T, ID>{
Class<T> clazz;
@PersistenceContext
EntityManager entityManager;
public GenericDaoImpl(){
ParameterizedType parameterizedType = (ParameterizedType)getClass().getGenericSuperclass();
this.clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
@Override
public T find(ID id) {
return (T)entityManager.find(clazz, id);
}
// Criteria APIのpersit()メソッドで実現する。
@Override
public void persist(T entity) {
entityManager.persist(entity);
}
@Override
public void merge(T entity) {
entityManager.merge(entity);
}
@Override
public void remove(T entity) {
entityManager.remove(entity);
}
}
|