1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.item.database;
18
19 import java.util.List;
20
21 import javax.persistence.EntityManager;
22 import javax.persistence.EntityManagerFactory;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.springframework.batch.item.ItemWriter;
27 import org.springframework.beans.factory.InitializingBean;
28 import org.springframework.dao.DataAccessResourceFailureException;
29 import org.springframework.orm.jpa.EntityManagerFactoryUtils;
30 import org.springframework.util.Assert;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public class JpaItemWriter<T> implements ItemWriter<T>, InitializingBean {
50
51 protected static final Log logger = LogFactory.getLog(JpaItemWriter.class);
52
53 private EntityManagerFactory entityManagerFactory;
54
55
56
57
58
59
60 public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
61 this.entityManagerFactory = entityManagerFactory;
62 }
63
64
65
66
67 @Override
68 public void afterPropertiesSet() throws Exception {
69 Assert.notNull(entityManagerFactory, "An EntityManagerFactory is required");
70 }
71
72
73
74
75
76
77
78 @Override
79 public final void write(List<? extends T> items) {
80 EntityManager entityManager = EntityManagerFactoryUtils.getTransactionalEntityManager(entityManagerFactory);
81 if (entityManager == null) {
82 throw new DataAccessResourceFailureException("Unable to obtain a transactional EntityManager");
83 }
84 doWrite(entityManager, items);
85 entityManager.flush();
86 }
87
88
89
90
91
92
93
94
95 protected void doWrite(EntityManager entityManager, List<? extends T> items) {
96
97 if (logger.isDebugEnabled()) {
98 logger.debug("Writing to JPA with " + items.size() + " items.");
99 }
100
101 if (!items.isEmpty()) {
102 long mergeCount = 0;
103 for (T item : items) {
104 if (!entityManager.contains(item)) {
105 entityManager.merge(item);
106 mergeCount++;
107 }
108 }
109 if (logger.isDebugEnabled()) {
110 logger.debug(mergeCount + " entities merged.");
111 logger.debug((items.size() - mergeCount) + " entities found in persistence context.");
112 }
113 }
114
115 }
116
117 }