Hibernete Jbutton JDialog - Nadpisujące się obiekty

0

Witam,

W głównej klasie z GUI, posiadam JMenuBar a w nim JMenuItem dzięki któremu otwieram nowe okno JDialog. W JD posiadam kilka JTextField'ów. Z bazy danych wczytuję obiekt za pomocą Hibernate w następujący sposób:

 
                                ...
				Session session = FabrykaSesji.getSessionFactory().openSession();
				session.beginTransaction();
				
				nowy = (DanePodmiotu)session.get(DanePodmiotu.class, 1);
				
				session.getTransaction().commit();
				session.close();
                                ...

Za pomocą geterów wyjmuję dane z obiektu i umieszczam je w poszczególnych JTexField'ach

W/w JDialog posiada saveButton, który zapisuje zmiany seterami i wykonuję update obiektu za pomocą Hiber. Dzieję się to w ten sposób:

 
                                       ...
					saveButton.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent e) {
							
							Session sessionTwo = FabrykaSesji.getSessionFactory().openSession();
							sessionTwo.beginTransaction();
							nowy.setNazwa(poleNazwa.getText());
							sessionTwo.update(nowy);
							sessionTwo.getTransaction().commit();
							sessionTwo.close();
							System.out.println(nowy.getNazwa());
							dispose();
						}
					});
                                        ...

Gdy uruchomię aplikację i otworzę w/w JDialoga wszystkie dane wczytują się prawidłowo a na konsoli Hiber informuję mnie o wykonanym select. Gdy edytuję JTextFielda i kliknę na saveButton Hiber również informuję że został wykonany update, JDialog zamyka się poprzez metodę dispose(). Nie zamykając głównego okna GUI ponownie wchodzę do JDialoga i wczytane dane są również prawidłowe czyli takie na jakie zostały zmienione przed chwilą. Zaczynam kolejną edycję i znów klikam na saveButton tym razem na konsoli wyskakuję mi informacja, że hiber wykonał dwa update'y na tym samym obiekcie. Wchodząc po raz trzeci do w/w JDialoga wczytują się dane ale tylko te po pierwszej edycji.

Gdy wywalam na konslole System.out.println(nowy.getNazwa()); (getNazwa - element który edytuję) to dostaję info że podczas pierwszego update'a dane są ok czyli na takie jak zmieniłem a podczas 2 znów są te same - skąd ten drugi !!!

Wspomnę jeszcze tylko że jeżeli wejdę do tego Jdialog 5 razy bez zamykania głównego okna i wykonam save to hiber wykona 5 update tego samego obiektu.

0

W momencie wykonania metody dispose() zamyka się okno jDialog i mimo dokonanych zmian i zapisania obiektu do bazy, obiekt musi zostawać w pamięci, podejrzewam że podczas gdy otwieram ponownie Jdialog to tworzy się identyczny obiekt i po dokonaniu zmian i wykonaniu update Hiber zapisuje je ale widzi również pierwszy obiekt który w jakiś sposób ma tą samą referencję i nadpisuje prawidłowy obiekt tym wcześniejszym.

0

hmmm żadnych wskazówek sugestii ??

0

Cześć.
Podrzuć troszkę więcej kodu.
Chciałbym zobaczyć, jak wygląda klasa okna, gdzie masz zmienna tego obiektu ,który zaczytujesz z hibernate'a

0
Black007 napisał(a)

Cześć.
Podrzuć troszkę więcej kodu.
Chciałbym zobaczyć, jak wygląda klasa okna, gdzie masz zmienna tego obiektu ,który zaczytujesz z hibernate'a

Kod tego JDialoga wygląda tak:

package Praca.Inzynierska;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.border.TitledBorder;
import org.hibernate.Session;
import static Praca.Inzynierska.Jezyk.*;

public class DanePodmiotuGUI extends javax.swing.JDialog{
	
	private DanePodmiotu nowy;
	//private Session session;
	
	private ResourceBundle msgs = ResourceBundle.getBundle("Jezyk/Jezyk");
	
	private JTabbedPane zakladki;
	private JPanel podstawowePanel = new JPanel();
	private JPanel pozostalePanel = new JPanel();

	private JTextField poleNazwa;
	private JTextField poleUlica;
	private JTextField poleNrDomu;
	private JTextField poleNrLokalu;
	private JTextField poleKod;
	private JTextField poleMiejscowosc;
	private JTextField poleWojewodztwo;
	private JTextField poleTelefony;
	private JTextField poleFaks;
	private JTextField poleNip;
	private JTextField poleRegon;
	private JTextField poleWww;
	private JTextField poleMail;
	private JTextField poleNumerKonta;
	private JTextField poleNazwaBanku;
	
	private TitledBorder ramka;
	
	private JLabel tinInfo;
	private JLabel crcInfo;

	public DanePodmiotuGUI(JFrame frame) {
		super(frame);

		setModal(true);
		initGUI();
		
		
	}
	
	private void initGUI() {
		try {
			
			{	
				ustawJezykDanePodmiotu(GlowneGUI.msgs);
				
				Session session = FabrykaSesji.getSessionFactory().openSession();			
				session.beginTransaction();

				nowy = (DanePodmiotu)session.get(DanePodmiotu.class, 1);
				
				session.getTransaction().commit();
				session.close();
				zakladki = new JTabbedPane();
				zakladki.setBounds(10, 10, 480, 250);
				
				zakladki.addTab(getZakladkaPodstawowe(), null, podstawowePanel, msgs.getString("podpowiedzPodstawowe"));
				podstawowePanel.setLayout(null);
				
				{
					getNazwaPodstawowy().setBounds(20, 20, 80, 20);
					poleNazwa = new JTextField();
					poleNazwa.setBounds(100, 20, 370, 20);
					poleNazwa.setText(nowy.getNazwa());
					podstawowePanel.add(getNazwaPodstawowy());
					podstawowePanel.add(poleNazwa);
					
					getUlicaPodstawowy().setBounds(20, 45, 50, 20);
					poleUlica = new JTextField();
					poleUlica.setBounds(100, 45, 150, 20);
					poleUlica.setText(nowy.getUlica());
					podstawowePanel.add(getUlicaPodstawowy());
					podstawowePanel.add(poleUlica);

					getNrDomuPodstawowy().setBounds(260, 45, 50, 20);
					poleNrDomu = new JTextField();
					poleNrDomu.setBounds(310, 45, 40, 20);
					poleNrDomu.setHorizontalAlignment(JTextField.RIGHT);
					poleNrDomu.setText(nowy.getNrDomu());
					podstawowePanel.add(getNrDomuPodstawowy());
					podstawowePanel.add(poleNrDomu);
					
					getNrLokaluPodstawowy().setBounds(370, 45, 55, 20);
					poleNrLokalu = new JTextField();
					poleNrLokalu.setBounds(430, 45, 40, 20);
					poleNrLokalu.setHorizontalAlignment(JTextField.RIGHT);
					poleNrLokalu.setText(nowy.getNrLokalu());
					podstawowePanel.add(getNrLokaluPodstawowy());
					podstawowePanel.add(poleNrLokalu);
					
					getKodPodstawowy().setBounds(20, 70, 80, 20);
					poleKod = new JTextField();
					poleKod.setBounds(100, 70, 50, 20);
					poleKod.setText(nowy.getKodPocztowy());
					podstawowePanel.add(getKodPodstawowy());
					podstawowePanel.add(poleKod);
					
					getMiejscowoscPodstawowy().setBounds(240, 70, 80, 20);
					poleMiejscowosc = new JTextField();
					poleMiejscowosc.setBounds(310, 70, 160, 20);
					poleMiejscowosc.setText(nowy.getMiejscowosc());
					podstawowePanel.add(getMiejscowoscPodstawowy());
					podstawowePanel.add(poleMiejscowosc);
					
					getWojewodzPodstawowy().setBounds(20, 95, 80, 20);
					poleWojewodztwo = new JTextField();
					poleWojewodztwo.setBounds(100, 95, 150, 20);
					poleWojewodztwo.setText(nowy.getWojewodztwo());
					podstawowePanel.add(getWojewodzPodstawowy());
					podstawowePanel.add(poleWojewodztwo);
					
					getTelefonyPodstawowy().setBounds(20, 120, 50, 20);
					poleTelefony = new JTextField();
					poleTelefony.setBounds(100, 120, 370, 20);
					poleTelefony.setText(nowy.getTelefony());
					podstawowePanel.add(getTelefonyPodstawowy());
					podstawowePanel.add(poleTelefony);
					
					getFaksPodstawowy().setBounds(20, 145, 50, 20);
					poleFaks = new JTextField();
					poleFaks.setBounds(100, 145, 150, 20);
					poleFaks.setText(nowy.getFax());
					podstawowePanel.add(getFaksPodstawowy());
					podstawowePanel.add(poleFaks);
					
					getNipPodstawowy().setBounds(20, 170, 50, 20);
					poleNip = new JTextField();
					poleNip.setBounds(100, 170, 150, 20);
					poleNip.setText(nowy.getNip());
					poleNip.setEditable(false);
					podstawowePanel.add(getNipPodstawowy());
					podstawowePanel.add(poleNip);
					
					getRegonPodstawowy().setBounds(260, 170, 50, 20);
					poleRegon = new JTextField();
					poleRegon.setBounds(310, 170, 160, 20);
					poleRegon.setText(nowy.getRegon());
					podstawowePanel.add(getRegonPodstawowy());
					podstawowePanel.add(poleRegon);
					
					if (GlowneGUI.getAktualnyJezyk().equals("en_EN")) {
						tinInfo = new JLabel();
						tinInfo.setText("TIN* - Tax Identification Number");
						tinInfo.setBounds(20, 205, 200, 20);
						podstawowePanel.add(tinInfo);
						
						crcInfo = new JLabel();
						crcInfo.setText("CRC* - Company Registration Certificate");
						crcInfo.setBounds(260, 205, 200, 20);
						podstawowePanel.add(crcInfo);
					}
					
				}
				
				zakladki.addTab(getZakladkaPozostale(), null, pozostalePanel, msgs.getString("podpowiedzPozostale"));
				pozostalePanel.setLayout(null);
				
				{
					getWwwPozostale().setBounds(20, 20, 80, 20);
					poleWww = new JTextField();
					poleWww.setBounds(100, 20, 350, 20);
					poleWww.setText(nowy.getWww());
					pozostalePanel.add(getWwwPozostale());
					pozostalePanel.add(poleWww);
					
					getMailPozostale().setBounds(20, 45, 80, 20);
					poleMail = new JTextField();
					poleMail.setBounds(100, 45, 350,20);
					poleMail.setText(nowy.geteMail());
					pozostalePanel.add(poleMail);
					pozostalePanel.add(getMailPozostale());
					
					ramka = BorderFactory.createTitledBorder(getRachunekPozostale());
					JPanel bank = new JPanel();
					bank.setLayout(null);
					bank.setBounds(20, 100, 450, 100);
					bank.setBorder(ramka);
					pozostalePanel.add(bank);
					
					getNumerPozostale().setBounds(20, 30, 50, 20);
					poleNumerKonta = new JTextField();
					poleNumerKonta.setBounds(80, 30, 350, 20);
					poleNumerKonta.setText(nowy.getNumerKonta());
					bank.add(getNumerPozostale());
					bank.add(poleNumerKonta);
					
					getNazwaPozostale().setBounds(20, 55, 50, 20);
					poleNazwaBanku = new JTextField();
					poleNazwaBanku.setBounds(80, 55, 350, 20);
					poleNazwaBanku.setText(nowy.getNazwaBanku());
					bank.add(getNazwaPozostale());
					bank.add(poleNazwaBanku);
				}
				
				getAnulujButton().setBounds(410, 280, 80, 25);

				getZapiszButton().setBounds(320, 280, 80, 25);
				
				
					getZapiszButton().addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent e) {
							
							Session sessionTwo = FabrykaSesji.getSessionFactory().openSession();
							sessionTwo.beginTransaction();
							getNowy().setNazwa(poleNazwa.getText());
							sessionTwo.update(nowy);
							sessionTwo.getTransaction().commit();
							sessionTwo.close();
							System.out.println(nowy.getNazwa());
							dispose();
						}
					});
				
				
				{
					getAnulujButton().addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent e) {
							dispose();
						}
					});
				}
				
				add(zakladki);
				add(getAnulujButton());
				add(getZapiszButton());

			}
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			setResizable(false);
			setTitle(getTytulOkna());
			setLayout(null);
			setSize(500, 350);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public DanePodmiotu getNowy() {
		return nowy;
	}

	public void setNowy(DanePodmiotu nowy) {
		this.nowy = nowy;
	}

	public JTextField getPoleNazwa() {
		return poleNazwa;
	}

	public void setPoleNazwa(JTextField poleNazwa) {
		this.poleNazwa = poleNazwa;
	}

	public JTextField getPoleUlica() {
		return poleUlica;
	}

	public void setPoleUlica(JTextField poleUlica) {
		this.poleUlica = poleUlica;
	}

	public JTextField getPoleNrDomu() {
		return poleNrDomu;
	}

	public void setPoleNrDomu(JTextField poleNrDomu) {
		this.poleNrDomu = poleNrDomu;
	}

	public JTextField getPoleNrLokalu() {
		return poleNrLokalu;
	}

	public void setPoleNrLokalu(JTextField poleNrLokalu) {
		this.poleNrLokalu = poleNrLokalu;
	}

	public JTextField getPoleKod() {
		return poleKod;
	}

	public void setPoleKod(JTextField poleKod) {
		this.poleKod = poleKod;
	}

	public JTextField getPoleMiejscowosc() {
		return poleMiejscowosc;
	}

	public void setPoleMiejscowosc(JTextField poleMiejscowosc) {
		this.poleMiejscowosc = poleMiejscowosc;
	}

	public JTextField getPoleWojewodztwo() {
		return poleWojewodztwo;
	}

	public void setPoleWojewodztwo(JTextField poleWojewodztwo) {
		this.poleWojewodztwo = poleWojewodztwo;
	}

	public JTextField getPoleTelefony() {
		return poleTelefony;
	}

	public void setPoleTelefony(JTextField poleTelefony) {
		this.poleTelefony = poleTelefony;
	}

	public JTextField getPoleFaks() {
		return poleFaks;
	}

	public void setPoleFaks(JTextField poleFaks) {
		this.poleFaks = poleFaks;
	}

	public JTextField getPoleNip() {
		return poleNip;
	}

	public void setPoleNip(JTextField poleNip) {
		this.poleNip = poleNip;
	}

	public JTextField getPoleRegon() {
		return poleRegon;
	}

	public void setPoleRegon(JTextField poleRegon) {
		this.poleRegon = poleRegon;
	}

	public JTextField getPoleWww() {
		return poleWww;
	}

	public void setPoleWww(JTextField poleWww) {
		this.poleWww = poleWww;
	}

	public JTextField getPoleMail() {
		return poleMail;
	}

	public void setPoleMail(JTextField poleMail) {
		this.poleMail = poleMail;
	}

	public JTextField getPoleNumerKonta() {
		return poleNumerKonta;
	}

	public void setPoleNumerKonta(JTextField poleNumerKonta) {
		this.poleNumerKonta = poleNumerKonta;
	}

	public JTextField getPoleNazwaBanku() {
		return poleNazwaBanku;
	}

	public void setPoleNazwaBanku(JTextField poleNazwaBanku) {
		this.poleNazwaBanku = poleNazwaBanku;
	}
}


 

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