Project

General

Profile

« Previous | Next » 

Revision 98db0610

Added by Andreas Kohlbecker about 5 years ago

ref #8132 fixin bug related to transaction rollback in CdmStore

View differences:

src/main/java/eu/etaxonomy/cdm/service/CdmStore.java
52 52
    @Qualifier("cdmRepository")
53 53
    private CdmRepository repo;
54 54

  
55

  
56
    /**
57
     * If the bean is contained in the session it is being updated by doing an
58
     * evict and merge. The fieldGroup is updated with the merged bean.
59
     *
60
     *
61
     * @param bean
62
     * @return The bean merged to the session or original bean in case a merge
63
     *         was not necessary.
64
     */
65
    public <T extends CdmBase> T mergedBean(T bean) throws IllegalStateException {
66

  
67
        try{
68
            TransactionStatus txStatus = repo.startTransaction();
69
            Session session = repo.getSession();
70
            try {
71
                if (session.contains(bean)) {
72
                    // evict bean before merge to avoid duplicate beans in same session
73
                    logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString());
74
                    session.evict(bean);
75
                }
76
                logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString());
77
                @SuppressWarnings("unchecked")
78
                T mergedBean = (T) session.merge(bean);
79
                session.flush();
80
                repo.commitTransaction(txStatus);
81
                logger.trace(this._toString() + ".mergedBean() - bean after merge " + bean.toString());
82
                return mergedBean;
83
            } catch(Exception e){
84
                repo.getTransactionManager().rollback(txStatus);
85
                throw e;
86
            }
87
        } finally {
88
            repo.clearSession(); // #7559
89
        }
90
    }
91

  
92

  
93 55
    protected String _toString() {
94 56
        return this.getClass().getSimpleName() + "@" + this.hashCode();
95 57
    }
......
109 71
        } else {
110 72
            changeEventType = Type.CREATED;
111 73
        }
112
        
74

  
113 75
        try{
114 76
            TransactionStatus txStatus = repo.startTransaction();
115 77
            Session session = repo.getSession();
116 78
            try {
117 79
                logger.trace(this._toString() + ".onEditorSaveEvent - merging bean into session");
118 80
                // merge the changes into the session, ...
119
                T mergedBean = mergedBean(bean);
120
                session.flush();
81
                if (session.contains(bean)) {
82
                    // evict bean before merge to avoid duplicate beans in same session
83
                    logger.trace(this._toString() + ".mergedBean() - evict " + bean.toString());
84
                    session.evict(bean);
85
                }
86
                logger.trace(this._toString() + ".mergedBean() - doing merge of" + bean.toString());
87
                @SuppressWarnings("unchecked")
88
                T mergedBean = (T) session.merge(bean);
121 89
                repo.commitTransaction(txStatus);
122 90
                return new EntityChangeEvent(mergedBean, changeEventType, view);
123 91
            } catch(Exception e){
124
                repo.getTransactionManager().rollback(txStatus);
92
                transactionRollbackIfNotCompleted(txStatus);
125 93
                throw e;
126 94
            }
127 95
        } finally {
......
130 98

  
131 99
    }
132 100

  
101

  
102
    /**
103
     * @param txStatus
104
     */
105
    public void transactionRollbackIfNotCompleted(TransactionStatus txStatus) {
106
        if(!txStatus.isCompleted()){
107
            repo.getTransactionManager().rollback(txStatus);
108
        }
109
    }
110

  
133 111
    /**
134 112
     *
135 113
     * @param bean
......
140 118
        IService<T> typeSpecificService = serviceFor(bean);
141 119

  
142 120
        try{
143
            Session session = repo.getSession();     
121
            Session session = repo.getSession();
144 122
            logger.trace(this._toString() + ".deleteBean - deleting" + bean.toString());
145 123
            DeleteResult result = typeSpecificService.delete(bean);
146 124
            if (result.isOk()) {

Also available in: Unified diff