|
14 | 14 | */
|
15 | 15 | package org.grails.datastore.gorm.jpa.support;
|
16 | 16 |
|
17 |
| -import org.grails.datastore.gorm.support.DatastorePersistenceContextInterceptor; |
18 |
| -import org.grails.datastore.mapping.core.DatastoreUtils; |
19 |
| -import org.grails.datastore.mapping.core.Session; |
| 17 | +import org.codehaus.groovy.grails.support.PersistenceContextInterceptor; |
20 | 18 | import org.grails.datastore.mapping.jpa.JpaDatastore;
|
21 |
| -import org.grails.datastore.mapping.transactions.SessionHolder; |
22 |
| -import org.springframework.transaction.support.TransactionSynchronizationManager; |
| 19 | +import org.grails.datastore.mapping.jpa.JpaSession; |
| 20 | +import org.springframework.orm.jpa.EntityManagerFactoryUtils; |
| 21 | +import org.springframework.orm.jpa.JpaCallback; |
| 22 | +import org.springframework.orm.jpa.JpaTemplate; |
| 23 | + |
| 24 | +import javax.persistence.EntityManager; |
| 25 | +import javax.persistence.FlushModeType; |
| 26 | +import javax.persistence.PersistenceException; |
23 | 27 |
|
24 | 28 | /**
|
25 | 29 | * @author Graeme Rocher
|
26 | 30 | * @since 1.0
|
27 | 31 | */
|
28 |
| -public class JpaPersistenceContextInterceptor extends DatastorePersistenceContextInterceptor { |
| 32 | +public class JpaPersistenceContextInterceptor implements PersistenceContextInterceptor { |
29 | 33 |
|
30 | 34 | private JpaDatastore jpaDatastore;
|
| 35 | + private EntityManager entityManager; |
31 | 36 |
|
32 | 37 | public JpaPersistenceContextInterceptor(JpaDatastore datastore) {
|
33 |
| - super(datastore); |
34 |
| - this.jpaDatastore = datastore; |
| 38 | + this.jpaDatastore= datastore; |
| 39 | + } |
| 40 | + |
| 41 | + @Override |
| 42 | + public void init() { |
| 43 | + entityManager = EntityManagerFactoryUtils.getTransactionalEntityManager(jpaDatastore.getEntityManagerFactory()); |
35 | 44 | }
|
36 | 45 |
|
37 | 46 | @Override
|
38 |
| - protected Session getSession() { |
39 |
| - SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(jpaDatastore); |
40 |
| - if (sessionHolder != null) { |
41 |
| - return sessionHolder.getSession(); |
| 47 | + public void destroy() { |
| 48 | + entityManager = null; |
| 49 | + } |
| 50 | + |
| 51 | + @Override |
| 52 | + public void disconnect() { |
| 53 | + if(entityManager != null) { |
| 54 | + EntityManagerFactoryUtils.closeEntityManager(entityManager); |
42 | 55 | }
|
43 | 56 |
|
44 |
| - return DatastoreUtils.bindSession(jpaDatastore.connect()); |
| 57 | + } |
| 58 | + |
| 59 | + @Override |
| 60 | + public void reconnect() { |
| 61 | + entityManager = EntityManagerFactoryUtils.getTransactionalEntityManager(jpaDatastore.getEntityManagerFactory()); |
45 | 62 | }
|
46 | 63 |
|
47 | 64 | @Override
|
48 | 65 | public void flush() {
|
49 |
| - // do nothing |
| 66 | + if(JpaSession.hasTransaction()) |
| 67 | + entityManager.flush(); |
| 68 | + } |
| 69 | + |
| 70 | + @Override |
| 71 | + public void clear() { |
| 72 | + entityManager.clear(); |
| 73 | + } |
| 74 | + |
| 75 | + @Override |
| 76 | + public void setReadOnly() { |
| 77 | + entityManager.setFlushMode(FlushModeType.COMMIT); |
| 78 | + } |
| 79 | + |
| 80 | + @Override |
| 81 | + public void setReadWrite() { |
| 82 | + entityManager.setFlushMode(FlushModeType.AUTO); |
| 83 | + } |
| 84 | + |
| 85 | + @Override |
| 86 | + public boolean isOpen() { |
| 87 | + return entityManager != null && entityManager.isOpen(); |
50 | 88 | }
|
51 | 89 | }
|
0 commit comments