1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package net.sourceforge.mystique.infrastructure.persistence;
22
23 import java.util.List;
24
25 import javax.persistence.NoResultException;
26 import javax.persistence.Query;
27
28 import net.sourceforge.mystique.domain.entity.User;
29 import net.sourceforge.mystique.domain.repository.RepositoryException;
30 import net.sourceforge.mystique.domain.repository.UserRepository;
31
32 import org.springframework.dao.DataIntegrityViolationException;
33 import org.springframework.stereotype.Repository;
34 import org.springframework.transaction.annotation.Transactional;
35
36
37
38
39 @Repository
40 public class UserJpaRepository extends JpaRepository<User, Long> implements UserRepository {
41
42 @Override
43 @Transactional(readOnly = true)
44 public User findById(Long id) throws RepositoryException {
45
46 return entityManager.find(User.class, id);
47
48 }
49
50 @Override
51 @Transactional(readOnly = true)
52 @SuppressWarnings("unchecked")
53 public List<User> findAll(int offset, int limit) throws RepositoryException {
54
55 Query query = entityManager.createNamedQuery("User.findAll");
56 query.setFirstResult(offset);
57 query.setMaxResults(limit);
58
59 return query.getResultList();
60
61 }
62
63 @Override
64 @Transactional(readOnly = true)
65 public User findByEmail(String email) throws RepositoryException {
66
67 Query query = entityManager.createNamedQuery("User.findByEmail");
68 query.setParameter("email", email);
69
70 return (User) query.getSingleResult();
71
72 }
73
74 @Override
75 @Transactional
76 public void store(User user) throws RepositoryException {
77
78 try {
79
80 User storedUser = findByEmail(user.getEmail());
81
82 if (storedUser != null && !storedUser.getId().equals(user.getId())) {
83 throw new DataIntegrityViolationException("exception.userAlreadyRegistred");
84 }
85
86 } catch (NoResultException e) {
87
88 entityManager.persist(user);
89
90 if (user.getId() != null) {
91 entityManager.merge(user);
92 }
93
94 entityManager.flush();
95
96 }
97
98 }
99
100 }