Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. public class ProjectDAO {
  2.  
  3. private final Provider<EntityManager> entityManagerProvider;
  4.  
  5. @Inject
  6. public ProjectDAO(Provider<EntityManager> entityManagerProvider) {
  7.  
  8. this.entityManagerProvider = entityManagerProvider;
  9. }
  10. }
  11.  
  12. @NamedQueries({
  13. @NamedQuery(name = "project.findAll", query = "from project"),
  14. @NamedQuery(name = "project.deleteByProjectName", query = "delete from project p where p.name = :project_name")
  15. }
  16. )
  17. @Entity(name = "project")
  18. public class Project {
  19.  
  20. @Id
  21. @GeneratedValue
  22. private Long id;
  23.  
  24. @Column(name="name")
  25. private String name;
  26.  
  27. // ... getters/setters
  28. }
  29.  
  30. public class ProjectDAO {
  31.  
  32. private final Provider<EntityManager> entityManagerProvider;
  33.  
  34. @Inject
  35. public ProjectDAO(Provider<EntityManager> entityManagerProvider) {
  36. this.entityManagerProvider = entityManagerProvider;
  37. }
  38.  
  39. public void insert(Project project) {
  40. entityManagerProvider.get().persist(project);
  41. }
  42.  
  43. public List<Project> findAll() {
  44.  
  45. return entityManagerProvider.get()
  46. .createNamedQuery("project.findAll", Project.class)
  47. .getResultList();
  48. }
  49.  
  50. public void delete(String projectName) {
  51.  
  52. entityManagerProvider.get()
  53. .createNamedQuery("project.deleteByProjectName")
  54. .setParameter("project_name", projectName)
  55. .executeUpdate();
  56. }
  57.  
  58. public Project findById(Long id) {
  59.  
  60. return entityManagerProvider.get().find(Project.class, id);
  61. }
  62. }
  63.  
  64. public class ProjectService {
  65.  
  66. private final ProjectDAO projectDAO;
  67.  
  68. @Inject
  69. public ProjectService(ProjectDAO projectDAO) {
  70.  
  71. this.projectDAO = projectDAO;
  72. }
  73.  
  74. @Transactional
  75. public void addProject(Project project) {
  76. projectDAO.insert(project);
  77. }
  78.  
  79. @Transactional
  80. public List<Project> findAll() {
  81. return projectDAO.findAll();
  82. }
  83.  
  84. @Transactional
  85. public void delete(String projectName) {
  86. projectDAO.delete(projectName);
  87. }
  88.  
  89. @Transactional
  90. public Project findById(Long id) {
  91. return projectDAO.findById(id);
  92. }
  93.  
  94. public EntityManager getEntityManager() {
  95. return projectDAO.getEntityManager();
  96. }
  97. }
  98.  
  99. public class Start {
  100.  
  101. public static void main(String[] args) throws InterruptedException {
  102.  
  103. Injector injector = Guice.createInjector(new AbstractModule() {
  104. @Override
  105. protected void configure() {
  106. install(new JpaPersistModule("hibernatetesting"));
  107. bind(ProjectService.class).in(Scopes.SINGLETON);
  108. }
  109. });
  110.  
  111. ProjectService projectService = injector.getInstance(ProjectService.class);
  112. PersistService persistService = injector.getInstance(PersistService.class);
  113.  
  114. persistService.start();
  115.  
  116. // For the purpose of making transactions from different threads, we
  117. // create two single threaded executors
  118. ExecutorService executorService1 = Executors.newSingleThreadExecutor();
  119.  
  120. ExecutorService executorService2 = Executors.newSingleThreadExecutor();
  121.  
  122. // Execute a few queries from Thread 1
  123. CountDownLatch countDownLatch1 = new CountDownLatch(1);
  124.  
  125. executorService1.execute(() -> {
  126. projectService.addProject(new Project("project1"));
  127. projectService.addProject(new Project("project2"));
  128. countDownLatch1.countDown();
  129. });
  130.  
  131. countDownLatch1.await();
  132.  
  133.  
  134. // Execute a few queries from Thread 2
  135. CountDownLatch countDownLatch2 = new CountDownLatch(1);
  136.  
  137. executorService2.execute(() -> {
  138. projectService.addProject(new Project("project3"));
  139. projectService.addProject(new Project("project4"));
  140.  
  141. //----
  142. projectService.delete("project1");
  143. //----
  144.  
  145. // project3 is not shown in this list
  146. projectService.findAll().forEach(System.out::println);
  147. countDownLatch2.countDown();
  148. });
  149.  
  150. countDownLatch2.await();
  151.  
  152. // Execute a few more queries from Thread 1
  153. CountDownLatch countDownLatch3 = new CountDownLatch(1);
  154.  
  155. executorService1.execute(() -> {
  156. projectService.addProject(new Project("project5"));
  157. projectService.addProject(new Project("project6"));
  158.  
  159. // project3, which was deleted in Thread 2 is still visible in
  160. // this EntityManager
  161. // ----
  162. Project project = projectService.findById(3L);
  163. System.out.println("Project still exists " + project);
  164. // ----
  165.  
  166. projectService.findAll().forEach(System.out::println);
  167. countDownLatch3.countDown();
  168. });
  169.  
  170. countDownLatch3.await();
  171.  
  172. }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement