Czy tworzenie enitytyManagera w konstruktorze jest poprwane?

0

Czy tworzenie enitytyManagera w konstruktorze jest poprwane? Będzie się tworzył za każdym razem, gdy stworzę obiekt klasy Db. Czy w każdej metodzie będę musiał zrobić close czy może jakoś inaczej powinno to wyglądać? I pytanie czy cała transakcja powinna być w bloku try/catch?

 
package com.my.app.daoImpl;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.my.app.models.Employee;

public class Db {
	
	private EntityManagerFactory entityManagerFactory;
	private EntityManager entityManager;
	
	public Db(){
		entityManagerFactory = Persistence.createEntityManagerFactory("myDatabaseConfiguration");
		entityManager = entityManagerFactory.createEntityManager();
	}
	
	public void saveEmployee(Employee employee){
		//rozpoczynamy transakcje
		entityManager.getTransaction().begin();
		entityManager.persist(employee);
		entityManager.getTransaction().commit(); //konczymy tranasakcje	
		//Czy to ma tutaj sens?
		entityManager.close();
		entityManagerFactory.close();
	}
}

0

Podłączę się do pytania, jeśli można ;)
Co sądzicie o dodaniu metody

public void closeConnection()
{
entityManager.close();
entityManagerFactory.close();
}
 

i wykorzystaniu jej przy zamykaniu okna np. w swingu?

2

To będzie masakra jak tak zrobisz. Niech klasa DB będzie bezstanowym singletonem tworzonym raz. Inaczej nic z tego nie będzie. Nie korzystasz w tej aplikacji z jakiegoś IoC?

0

@Shalom pytanie czy tak będzie dobrze? Teraz mogę tworzyć dowolną liczbę obiektów klasy Db, a i tak otrzymam ten sam enitytyMangerFactor i enityManger jeśli dobrze to rozumiem?

 
package com.my.app.daoImpl;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.my.app.models.Employee;

public final class Db {
	
	private final static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myDatabaseConfiguration");
	private final static EntityManager entityManager = entityManagerFactory.createEntityManager();
	
	
	public static EntityManagerFactory getRefEntityManagerFactory(){
		return entityManagerFactory;
	}
	
	public static EntityManager getRefEntityManager(){
		return entityManager;
	}
	
	public void saveEmployee(Employee employee){
		entityManager.getTransaction().begin();
		entityManager.persist(employee);
		entityManager.getTransaction().commit(); //konczymy tranasakcje	
	}
	
	public void closeConnetion(){
		entityManager.close();
		entityManagerFactory.close();
	}
}

W ten sposób mam zapisywać?

 
		btnLogin.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				System.out.println("Test Login kontroler");
				
				//dodamy pracawnika Zenon Nowak dla testu
				
				Employee employee = new Employee("Marcin", "Dawid", 4440.44,new BigDecimal("2011.11"));
				Db db = new Db();
				db.saveEmployee(employee);
				
				ViewChanger viewChanger = new ViewChanger();
				viewChanger.changeView("/com/my/app/views/MainView.fxml", "TaskManager"); 
				
			}
		});
1

Nie widzę po co tworzysz tu w takim razie obiekty DB. Jak juz tak chcesz zrobić to wszystko moze być statyczne. Ale ciekawi mnie jak napiszesz do tego testy... :P

0

@Shalom pisałeś o Singletonie, więc napisałem wzorując się na tym: http://1drv.ms/1AChp0b. Pisanie wszystkie statycznie jest raczej złe. Jak zrobić nie statyczny singleton, czy która metoda z tego dokumentu będzie odpowiednia?

1

No dobra, tylko że tam masz ładnie opisany singleton a nie to co ty zrobiłeś o_O Singletonem miała być klasa DB a u ciebie można stworzyć tyle obiektów DB ile sie chce... Napisałem też o IoC które jest lepszym rozwiązaniem i jest zwyczajnie łatwiejsze.

0

To to już chyba lepiej:

public final class DbSingleton {

	private static DbSingleton instance = null;
	private EntityManagerFactory entityManagerFactory;
	private EntityManager entityManager;

	private DbSingleton(){
		entityManagerFactory = Persistence
				.createEntityManagerFactory("myDatabaseConfiguration");
		entityManager = entityManagerFactory
				.createEntityManager();
		System.out.println("Singleton created");
	}
	
	public static synchronized DbSingleton getInstance(){
		if(instance == null){
			instance = new DbSingleton();
		}
		return instance;
	}
 

A potem:

DbSingleton db = DbSingleton.getInstance();
1

Czy ja wiem? A zalezy ci na leniwej inicjalizacji? Bo jak nie, to ja bym od razu utworzył tą statyczną instancję i wywalił tego ifa i synchronizację z getInstance ;) Poza tym warto pamiętać że jedyna w pełni bezpieczna wersja singletona to taka oparta o enuma (bo tą twoją można popsuć przez serializację / deserializację ;) )

1 użytkowników online, w tym zalogowanych: 0, gości: 1