AWT + hibernate brak połączenia

0

Witam napisałem swój pierwszy kod w Hibernate i teraz chcę opatrzyć go w jakieś byle jakie GUI (Chcę na tym zakończyć 1projekt i iść dalej, a założenie miałem takie aby mieć GUI)
Do JButtona dodałem ActionListenera a w nim chciałem aby pojawił się nowy frame z polami do uzupełniania oraz z guzikiem aby wysłać dane do BAZY.
Lecz wywala mi błąd gdyż w public void actionPerformed(ActionEvent e) nie widzi mi formuły łączenia z bazą

 EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
		EntityManager entityManager = entityManagerFactory.createEntityManager();

Jeżeli dodam formułę EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
EntityManager entityManager = entityManagerFactory.createEntityManager();

do środka funkcji ` public void actionPerformed(ActionEvent e)` to wtedy wszystko ładnie śmiga, lecz łączy się z bazą danych po raz kolejny, a chciałbym aby po uruchomieni z programu było już połączenie z bazą danych.

Kod źródłowy:

public class Main {

public static void main(String[] args) {
	EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
	EntityManager entityManager = entityManagerFactory.createEntityManager();
	Funkcje funkcje = new Funkcje();
	//GUI
	
	JFrame frame = new JFrame();
	frame.setSize(500, 500);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	JButton button = new JButton("Click");
	JPanel panel = new JPanel();
	panel.setLayout(null);
	JTextArea textArea = new JTextArea();
	textArea.setBounds(190, 50, 200, 300);
	panel.add(textArea);
	button.setBounds(50, 50, 100, 30);
	
	button.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			
			JFrame addKsiazke = new JFrame("Dodaj książkę");
			addKsiazke.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			addKsiazke.setSize(250, 350);
			JPanel ksiazkaPanel = new JPanel();
			ksiazkaPanel.setLayout(null);
			JButton ksiazkaDodanie = new JButton("Dodaj");
			ksiazkaDodanie.setBounds(60, 270, 100, 30);
			ksiazkaPanel.add(ksiazkaDodanie);
			//Labele
			JLabel imie = new JLabel("Podaj imię:");
			JLabel nazwisko = new JLabel("Podaj nazwisko:");
			JLabel tytul = new JLabel("Podaj tytul:");
			imie.setBounds(70, 10, 150, 30);
			nazwisko.setBounds(70, 90, 150, 30);
			tytul.setBounds(70, 170, 150, 30);
			ksiazkaPanel.add(imie);
			ksiazkaPanel.add(nazwisko);
			ksiazkaPanel.add(tytul);
			//TextField
			JTextField imieField = new JTextField();
			JTextField nazwiskoField = new JTextField();
			JTextField tytulField = new JTextField();
			imieField.setBounds(50, 50, 150, 30);
			nazwiskoField.setBounds(50, 130, 150, 30);
			tytulField.setBounds(50, 210, 150, 30);
			ksiazkaPanel.add(imieField);
			ksiazkaPanel.add(nazwiskoField);
			ksiazkaPanel.add(tytulField);			
			addKsiazke.add(ksiazkaPanel);
			addKsiazke.setResizable(false);
			addKsiazke.setVisible(true);
			ksiazkaDodanie.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					String imieAutora = imieField.getText();
					String nazwiskoAutora = nazwiskoField.getText();
					String tytulKsiazki = tytulField.getText();
					funkcje.addBook(entityManager, imieAutora, nazwiskoAutora, tytulKsiazki);
					
					
				}
			});

		}
	});
	panel.add(button);
	frame.add(panel);
	frame.setVisible(true);
	entityManager.close();
	entityManagerFactory.close();
}

}



Error jaki wyskakuje 
`Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@74bf8030 is closed`
0

z całym szacunkiem, ale weź to jakoś podziel sensownie, bo oczopląsu dostałem
Inną sprawą jest, że w

public static void  main...

nie powinno się umieszczać logiki.
A tak to, będzie robić ponowne połączenie, bo po raz kolejny je będziesz wywoływał.
Masz to w main a potem w owym actionListener.

0

To co powinno znaleźć się w Main?? Połączenie na moje oko musi być w main aby w trakcie programu można było ciągle się łączyć z bazą a nie za każdym razem tworzyć nowe połączenie.
Rozumiem, że Gui do osobnej klasy lecz nawet w osobnej klasie to mi nie działało....

0

nie nie nie...
ogólnie jak korzystasz z GUI, to chcesz "upakować" GUI w main, które wystartuje "główną" klasę. Przykładowo:

public class MojaAplikacja{
    //pola prywatne i publiczne głównie wykorzystywane do GUI

    public MojaAplikacja() {
        // tu dajesz konfigurację wszystkich elementów GUI
	// oraz wszystkie ActionListenery, do guzików, JTextArea, JTextPane etc.
    }

    private void mojaPierwszaMetoda() {
	//tutaj możesz wrzucić połączenie z db, ale ta metoda powinna być wywołana z konstruktora powyżej, gdzie będzie ActionListener guzika

    }
    private void mojaDrugaMetoda() {
	//etc.
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame("MojaAplikacja");
        jFrame.setContentPane(new MojaAplikacja().panel1);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);
    }
}

To nadal jest "brzydkie" ale jest bardziej czytelne.
Jeśli bardzo chcesz to zrobić prawidłowo, to powinno się zrobić osobno klasę Main, która stworzy obiekt osobnej klasy MojaAplikacja i wtedy dopiero w MojaAplikacja upakować GUI + metody + logikę.
Skorzystaj może z GUI Designer w IntelliJ, to ułatwi ci zrozumieć koncept.

0

Czyli generalnie(Pomijając "Czystość kodu") w, każdym actionListener trzeba na nowo połączyć się z bazą danych?

0

Nie, zmienna entityManager powinna być polem klasy, a nie zmienna lokalną metody main. Np. coś takiego:

public class Main extends JFrame{
    EntityManagerFactory entityManagerFactory; 
    EntityManager entityManager;
    public static void main(String[] args) {
        new Main();
    }
    public Main(){
        entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
        entityManager = entityManagerFactory.createEntityManager();
        ...
0

Niestety, zrobiłem tak samo jak proponowałeś i dalej ten sam błąd wyskakuje

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