I made a generic DAO object that use @Transactional:
Code:
package hu.kepeslap.back.dao;
public abstract class GenericDAOWithJPA<T, ID extends Serializable> implements GenericDAO<T, ID> {
private Class<T> persistentClass;
private User userFilter;
protected static Logger log = Logger.getLogger("hu.kepeslap"); // RootLogger()
@PersistenceContext(unitName = "kepeslap")
protected EntityManager entityManager;
public GenericDAOWithJPA(Class<T> persistentClass) {
this.persistentClass = persistentClass;
log.debug("[Generic] GenericDAOWithJPA construction finished. PersistClass: " + this.persistentClass.getSimpleName());
}
public Class<T> getPersistentClass() {
return persistentClass;
}
@Transactional(readOnly = true)
public T loadById(ID id) {
return entityManager.find(persistentClass, id);
}
@Transactional
public void persist(T entity) {
entityManager.persist(entity);
}
@Transactional
public void update(T entity) {
entityManager.merge(entity);
}
@Transactional
public void delete(T entity) {
entityManager.remove(entity);
}
@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
public List<T> loadAll() {
return entityManager.createQuery("Select t from " + persistentClass.getSimpleName() + " t").getResultList();
}
public void setUserFilter(User loggedInUser) {
this.userFilter = loggedInUser;
if (loggedInUser != null) {
log.debug("[" + getClass().getSimpleName() + "] setUserFilter = {" + loggedInUser + ": id=" + loggedInUser.getUserId() + "}");
} else {
log.debug("[" + getClass().getSimpleName() + "] setUserFilter = {null}");
}
}
public User getUserFilter() {
return userFilter;
}
@Transactional
public void deleteAllByUserId(Long userId) {
Query query = entityManager.createQuery("Delete from " + persistentClass.getSimpleName() + " where userId = :userId");
query.setParameter("userId", userId);
query.executeUpdate();
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@SuppressWarnings("unchecked")
@Transactional(readOnly = true)
public List<T> loadLazy(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
log.debug("[Generic] "+getClass().getSimpleName()+".loadLazy {userFilter = "+userFilter+", first = "+first+", pageSize = "+pageSize+"}");
String where = "";
if (userFilter != null) {
where = "userId = " + String.valueOf(userFilter.getUserId());
log.debug("[Generic] ["+getClass().getSimpleName()+".loadLazy()] setUserFilter = {"+userFilter+": id="+userFilter.getUserId()+"}");
} else {
log.debug("[Generic] [" + getClass().getSimpleName() + ".loadLazy()] setUserFilter = {null}");
}
if (filters != null) {
for (Map.Entry<String, String> e : filters.entrySet())
where += (where.length() > 0 ? " AND " : "") + e.getKey() + " like '" + e.getValue() + "%'";
}
Query lazy = entityManager.createQuery("Select c from " + persistentClass.getSimpleName() + " c" + (where.length() > 0 ? " where " + where : "") + (sortField != null && sortOrder != null ? " order by " + sortField + " " + sortOrder : ""));
lazy.setFirstResult(first);
lazy.setMaxResults(pageSize);
return lazy.getResultList();
}
@Transactional(readOnly = true)
public BigInteger getRowCount(Map<String, String> filters) {
String where = "";
if (userFilter != null) {
where = "userId = " + String.valueOf(userFilter.getUserId());
}
if (filters != null) {
for (Map.Entry<String, String> e : filters.entrySet()) {
where += (where.length() > 0 ? " AND " : "") + e.getKey() + " like '" + e.getValue() + "%'";
}
}
BigInteger result = (BigInteger)this.entityManager.createNativeQuery("select count(*) from " + persistentClass.getSimpleName() + " c" + (where.length() > 0 ? " where " + where : "")).getSingleResult();
log.debug("[Generic] "+getClass().getSimpleName()+".rowCount {userFilter = "+userFilter+" , count = "+String.valueOf(result)+"}");
return result;
}
}
The UserServiceImpl.java:
Code:
package hu.kepeslap.middle.service;
//@ManagedBean(name="userService")
@Service("userService")
//@SessionScoped
@Scope("session")
public class UserServiceImpl extends GenericServiceImpl<User,Long> implements UserService {
@Autowired
private UserDAO userDAO;
@Autowired
private JpaTransactionManager txManager;
@Transactional
public void updateCurrentUser() throws EntityExistsException {
if (currentObject != null) {
//EntityManager entityManager = txManager.getEntityManagerFactory().createEntityManager();
//txManager.getTransaction().begin();
if (((User)currentObject).getUserId() != null) {
try {
List<User> exists = null;
exists = ((UserDAO)genericDAO).findByEmailAddress(((User)currentObject).getEmailAddress(), true);
if (exists != null) {
Iterator<User> iter = exists.iterator();
while (iter.hasNext()) {
User user = iter.next();
if (user.getUserId() != ((User)currentObject).getUserId()) {
throw new EntityExistsException("User exits with same e-mail");
}
}
((UserDAO)genericDAO).update((User)currentObject);
}
} catch (UsernameNotFoundException ex) {
((UserDAO)genericDAO).update((User)currentObject);
}
} else {
((UserDAO)genericDAO).persist((User)currentObject);
}
//entityManager.getTransaction().commit();
}
}
}
Thanx for help me.