Fixed Transactions not Getting Closed on the Server (#42)
Fixes #16 Reviewed-on: https://git.kske.dev/zdm/envoy/pulls/42 Reviewed-by: kske <kai@kske.dev>
This commit is contained in:
		@@ -3,9 +3,7 @@ package envoy.server.data;
 | 
			
		||||
import java.time.Instant;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import javax.persistence.EntityManager;
 | 
			
		||||
import javax.persistence.EntityTransaction;
 | 
			
		||||
import javax.persistence.Persistence;
 | 
			
		||||
import javax.persistence.*;
 | 
			
		||||
 | 
			
		||||
import envoy.data.User.UserStatus;
 | 
			
		||||
import envoy.server.net.ConnectionManager;
 | 
			
		||||
@@ -235,8 +233,8 @@ public final class PersistenceManager {
 | 
			
		||||
	public void addContactBidirectional(long contactID1, long contactID2) {
 | 
			
		||||
 | 
			
		||||
		// Get users by ID
 | 
			
		||||
		Contact	c1	= getContactByID(contactID1);
 | 
			
		||||
		Contact	c2	= getContactByID(contactID2);
 | 
			
		||||
		final var	c1	= getContactByID(contactID1);
 | 
			
		||||
		final var	c2	= getContactByID(contactID2);
 | 
			
		||||
 | 
			
		||||
		// Add users to each others contact lists
 | 
			
		||||
		c1.getContacts().add(c2);
 | 
			
		||||
@@ -259,20 +257,47 @@ public final class PersistenceManager {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void persist(Object obj) {
 | 
			
		||||
		try {
 | 
			
		||||
			transaction.begin();
 | 
			
		||||
			entityManager.persist(obj);
 | 
			
		||||
			transaction.commit();
 | 
			
		||||
 | 
			
		||||
			// Last transaction threw an error resulting in the transaction not being closed
 | 
			
		||||
		} catch (final IllegalStateException e) {
 | 
			
		||||
			if (transaction.isActive()) {
 | 
			
		||||
				transaction.rollback();
 | 
			
		||||
				persist(obj);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void merge(Object obj) {
 | 
			
		||||
		try {
 | 
			
		||||
			transaction.begin();
 | 
			
		||||
			entityManager.merge(obj);
 | 
			
		||||
			transaction.commit();
 | 
			
		||||
 | 
			
		||||
			// Last transaction threw an error resulting in the transaction not being closed
 | 
			
		||||
		} catch (final IllegalStateException e) {
 | 
			
		||||
			if (transaction.isActive()) {
 | 
			
		||||
				transaction.rollback();
 | 
			
		||||
				merge(obj);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void remove(Object obj) {
 | 
			
		||||
		try {
 | 
			
		||||
			transaction.begin();
 | 
			
		||||
			entityManager.remove(obj);
 | 
			
		||||
			transaction.commit();
 | 
			
		||||
 | 
			
		||||
			// Last transaction threw an error resulting in the transaction not being closed
 | 
			
		||||
		} catch (final IllegalStateException e) {
 | 
			
		||||
			if (transaction.isActive()) {
 | 
			
		||||
				transaction.rollback();
 | 
			
		||||
				remove(obj);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user