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.Milestone;
29 import net.sourceforge.mystique.domain.entity.Project;
30 import net.sourceforge.mystique.domain.repository.MilestoneRepository;
31 import net.sourceforge.mystique.domain.repository.RepositoryException;
32
33 import org.springframework.dao.DataIntegrityViolationException;
34 import org.springframework.stereotype.Repository;
35 import org.springframework.transaction.annotation.Transactional;
36
37
38
39
40 @Repository
41 public class MilestoneJpaRepository extends JpaRepository<Milestone, Long> implements MilestoneRepository {
42
43 @Override
44 @Transactional(readOnly = true)
45 public Milestone findById(Long id) throws RepositoryException {
46
47 return entityManager.find(Milestone.class, id);
48
49 }
50
51 @Override
52 @Transactional(readOnly = true)
53 @SuppressWarnings("unchecked")
54 public List<Milestone> findByProject(Project project, int offset, int limit) throws RepositoryException {
55
56 Query query = entityManager.createNamedQuery("Milestone.findByProject");
57 query.setParameter("project", project);
58
59 query.setFirstResult(offset);
60 query.setMaxResults(limit);
61
62 return query.getResultList();
63
64 }
65
66 @Override
67 @Transactional(readOnly = true)
68 public Milestone findByProjectAndName(Project project, String name) throws RepositoryException {
69
70 Query query = entityManager.createNamedQuery("Milestone.findByProjectAndName");
71 query.setParameter("project", project);
72 query.setParameter("name", name);
73
74 return (Milestone) query.getSingleResult();
75
76 }
77
78 @Override
79 @Transactional
80 public void store(Milestone milestone) throws RepositoryException {
81
82 try {
83
84 Milestone storedMilestone = findByProjectAndName(milestone.getProject(), milestone.getName());
85
86 if (storedMilestone != null && !storedMilestone.getId().equals(milestone.getId())) {
87 throw new DataIntegrityViolationException("exception.milestoneAlreadyRegistred");
88 }
89
90 } catch (NoResultException e) {
91
92 entityManager.persist(milestone);
93
94 if (milestone.getId() != null) {
95 entityManager.merge(milestone);
96 }
97
98 entityManager.flush();
99
100 }
101
102 }
103
104 }