Hallo,
ich habe eine allgemeine Frage.
In einer Stand-Alone-Anwendung wird mit Hibernate persistiert und alles funktioniert wie es soll. Diese Anwendung ist nicht von mir geschrieben worden, aber ich habe alles was mit Hibernate gemacht wurde gut nachvollziehen können. Ich arbeite aber mit einem Beispiel (Pizzeria), um die Situation nachzubilden.
Ich beschäftige mich selbst erst seit ca. einem Monat mit Hibernate und habe allgemein noch nicht viel Erfahrung mit Java.
Aber ich habe jetzt einiges zu "Sessions" und "Transactions", "pessimistic -" und "optimistic locking" gelesen. Es gibt leider wenig Beispiele, selbst in Büchern sondern mehr grob verfasste Theorien.
Ich recherchiere zu folgender Problematik:
Es ist eine erweitere Anforderung hinzugekommen. Die Anwendung soll bei mehreren Benutzern installiert werden, die dann über die Anwendung auf eine Datenbank zugreifen und es soll verhindert werden, dass es dadurch zu Zugriffsproblemen kommt.
Gewünscht ist:
1. Wenn eine Person ein Eltern-Objekt geöffnet hat, darf jeder alles lesen aber keiner mehr schreiben (auch in den Kind-Objekten nicht).
2. Die Personen sollen beim Öffnen des Eltern-Objektes darüber informiert werden und nicht erst wenn sie versuchen zu schreiben. (Also optimistic locking reicht nicht.)
Ich denke aber die einfachen Beispiele die ich gefunden habe, decken die Anforderungen nicht ab bzw. habe ich nichts gefunden womit sich Punkt zwei der Anforderung erfüllen lässt. Gibt es da etwas oder ist es eine unmögliche Anforderung?
Kann ich das überhaupt mit mehreren Stand-Alone-Anwendungen realisieren oder wäre das Quatsch und ich sollte eine Client-Server-Anwendung daraus machen?
Vielen Dank für jede hilfreiche Antwort. Es reicht mir völlig, wenn man mir bei der Richtung für die Lösung hilft.
Hibernate version: 3.2.2
Mapping documents:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="true" mutable="false" name="mypackage.Kunde" table="KUNDEN" optimistic-lock="version" select-before-update="false">
<id name="id" column="ID" type="integer">
<generator class="native"/>
</id>
<property name="name" column="NAME" type="string" not-null="true"/>
<property name="plz" column="PLZ" type="string"/>
<property name="ort" column="ORT" type="string"/>
<property name="datum" column="DATUM" type="date"/>
<set name="speisen" table="BESTELLUNGEN" lazy="true">
<key column="ID_KUNDE"/>
<many-to-many class="mypackage.Speise" column="ID_SPEISE"/>
</set>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():Code:
package hibernate;
import org.hibernate.*;
import org.hibernate.cfg.*;
// TODO: Auto-generated Javadoc
/**
* The Class persistenz.
*/
public class persistenz {
/** The session factory. */
private static SessionFactory sessionFactory = null;
/** The session kunden. */
private static Session sessionKunden = null;
/**
* Gets the session factory.
*
* @return the session factory
*/
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
System.out
.println("------------------------------------------------------");
System.out.println("Initializing Hibernate");
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure()
.buildSessionFactory();
System.out.println("Finished Initializing Hibernate");
System.out
.println("------------------------------------------------------");
} catch (HibernateException ex) {
ex.printStackTrace();
System.exit(5);
}
}
return sessionFactory;
}
/**
* Gets the session kunden.
*
* @return the session kunden
*/
public static Session getSessionKunden() {
if (sessionKunden == null) {
sessionKunden = getSessionFactory().openSession();
}
return sessionKunden;
}
}
Code:
package gui;
import hibernate.persistenz;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import org.hibernate.*;
import mypackage.Kunde;
import mypackage.Pizzeria;
// TODO: Auto-generated Javadoc
/**
* The Class KundenWindow.
*/
public class KundenWindow extends JFrame {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The textfield_name. */
JTextField textfield_name;
/** The textfield_plz. */
JTextField textfield_plz;
/** The textfield_ort. */
JTextField textfield_ort;
/** The textlist_name. */
JComboBox textlist_name;
/** The jlabel_name. */
JLabel jlabel_name;
/** The jlabel_plz. */
JLabel jlabel_plz;
/** The jlabel_ort. */
JLabel jlabel_ort;
/** The jlabel_nachricht. */
JLabel jlabel_nachricht;
/** The jlabel_namelist. */
JLabel jlabel_namelist;
/** The speichern. */
JButton speichern;
/** The loeschen. */
JButton abbrechen;
/** The name. */
private String name;
/** The plz. */
private String plz;
/** The ort. */
private String ort;
/** The parent. */
// private JFrame parent;
/** The kunde. */
Kunde kunde;
boolean lockingActive = false;
/**
* Instantiates a new Kunden window.
*
* @param kunde
* the kunde
*/
public KundenWindow(Kunde kunde) {
super("Kunde");
// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.kunde = kunde;
Session sess = null;
Transaction trx = null;
try {
sess = persistenz.getSessionKunden();
trx = sess.beginTransaction();
sess.refresh(kunde);
sess.disconnect();
sess.lock(kunde, LockMode.UPGRADE);
lockingActive = true;
System.out.println(lockingActive+"");
initWindow(kunde);
trx.commit();
} catch (HibernateException e) {
throw e;
}
}
/**
* Inits the window.
*
* @param kunde
* the kunde
*/
protected void initWindow(Kunde kunde) {
// Instanziieren:
textfield_name = new JTextField();
textfield_plz = new JTextField();
textfield_ort = new JTextField();
jlabel_nachricht = new JLabel();
jlabel_name = new JLabel();
jlabel_plz = new JLabel();
jlabel_ort = new JLabel();
jlabel_namelist = new JLabel();
// Hier auch gleich die Beschriftung und Icons der Buttons mit
// angegeben:
Icon icon1 = new ImageIcon("floppy.gif");
Icon icon2 = new ImageIcon("user_left.gif");
speichern = new JButton("speichern");
speichern.setIcon(icon1);
abbrechen = new JButton("abbrechen");
abbrechen.setIcon(icon2);
if (lockingActive == true) {
jlabel_nachricht.setText("Schreibschutz aktiv!");
} else {
jlabel_nachricht.setText("");
}
System.out.println(lockingActive+"");
jlabel_name.setText("Name:");
jlabel_plz.setText("PLZ:");
jlabel_ort.setText("Ort:");
textfield_name.setText(kunde.getName());
textfield_plz.setText(kunde.getPlz() + "");
textfield_ort.setText(kunde.getOrt());
jlabel_name.setFont(new Font("SansSerif", Font.BOLD, 14));
jlabel_plz.setFont(new Font("SansSerif", Font.BOLD, 14));
jlabel_ort.setFont(new Font("SansSerif", Font.BOLD, 14));
// Positionen festlegen
jlabel_name.setBounds(10, 20, 400, 25);
textfield_name.setBounds(10, 40, 400, 25);
jlabel_plz.setBounds(10, 80, 400, 25);
textfield_plz.setBounds(10, 100, 400, 25);
jlabel_ort.setBounds(10, 140, 400, 25);
textfield_ort.setBounds(10, 160, 400, 25);
speichern.setBounds(320, 190, 40, 25);
abbrechen.setBounds(360, 190, 40, 25);
// Listener aktivieren
Lauscher waechter = new Lauscher();
speichern.addActionListener(waechter);
abbrechen.addActionListener(waechter);
// Elemente dem Fenster hinzufügen:
// (this ist ein Zeiger auf dieses Objekt, also das Fenster)
this.getContentPane().add(jlabel_name);
this.getContentPane().add(jlabel_plz);
this.getContentPane().add(jlabel_ort);
this.getContentPane().add(textfield_name);
this.getContentPane().add(textfield_plz);
this.getContentPane().add(textfield_ort);
this.getContentPane().add(speichern);
this.getContentPane().add(abbrechen);
this.setLayout(null);
this.setBounds(300, 300, 460, 300);
this.setVisible(true);
}
/**
* The Class Lauscher.
*/
public class Lauscher implements ActionListener {
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent ereignis) {
// Hole Name aus Textfeld:
name = textfield_name.getText();
// Hole PLZ aus Textfeld:
try {
plz = textfield_plz.getText();
} catch (NumberFormatException e) {
plz = "";
}
// Hole Ort aus Textfeld:
ort = textfield_ort.getText();
String nachricht = ereignis.getActionCommand();
Pizzeria pizza = new Pizzeria();
if (nachricht.equals("speichern")) {
pizza.changeCustomer(kunde, name, plz, ort);
setVisible(false);
// pizza.showCustomers();
} else if (nachricht.equals("abbrechen")) {
pizza.changeCustomer(kunde, kunde.getName(), kunde.getPlz(),
kunde.getOrt());
setVisible(false);
} else {
setVisible(false);
}
// System.out.println(this.name);
// System.out.println(this.plz);
// System.out.println(this.plz);
}
}
}
Code:
/**
* The Class Pizzeria.
*/
public class Pizzeria {
/**
* Instantiates a new pizzeria.
*/
public Pizzeria() {
// Session sess = persistenz.getSessionKunden();
}
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(String[] args) {
String[][] jobListe = new String[][] {
{ "Kunde", "Manfred", "52146", "Wuerselen" },
{ "Kunde", "Torsten", "52072", "Aachen" },
{ "Kunde", "Roland", "52134", "Herzogenrath" },
{ "Kunde", "Josef", "52070", "Aachen" },
{ "Kunde", "Alexander", "52134", "Herzogenrath" },
{ "Kunde", "Achim", "52078", "Aachen" },
{ "Kunde", "Werner", "52066", "Aachen" },
{ "Speise", "Pizza Diabolo", "Teufelsohren", "5.5" },
{ "Speise", "Pizza Vulkano", "Teig, Kaese, Vesuvtomaten", "6" },
{ "Speise", "Pizza Feuro", "Pepperoni", "6.5" },
{ "Speise", "Lasagno", "Nudeln, Hackfleisch", "6" },
{ "Speise", "Salat Eskimo", "Eiswuerfel", "4.5" },
{ "Bestellung", "Manfred", "Pizza Diabolo" },
{ "Bestellung", "Torsten", "Lasagno" },
{ "Bestellung", "Torsten", "Salat Eskimo" },
{ "Bestellung", "Roland", "Pizza Feuro" },
{ "Bestellung", "Achim", "Pizza Feuro" },
{ "Zutaten", "Salat Eskimo", "Eiszapfen, Schnee" },
{ "Ort", "Aachen" } };
Pizzeria pizzeria = new Pizzeria();
for (int i = 0; i < jobListe.length; i++) {
execute(pizzeria, jobListe[i]);
}
System.exit(0);
}
/**
* Execute.
*
* @param pizzeria
* the pizzeria
* @param job
* the job
*/
private static void execute(Pizzeria pizzeria, String[] job) {
if (3 < job.length && job[0].equalsIgnoreCase("Kunde")) {
pizzeria.addCustomer(job[1], job[2], job[3]);
} else if (3 < job.length && job[0].equalsIgnoreCase("Speise")) {
pizzeria.addMeal(job[1], job[2], job[3]);
} else if (2 < job.length && job[0].equalsIgnoreCase("Bestellung")) {
pizzeria.addOrder(job[1], job[2]);
} else if (2 < job.length && job[0].equalsIgnoreCase("Zutaten")) {
pizzeria.exchangeIngredients(job[1], job[2]);
} else if (1 < job.length && job[0].equalsIgnoreCase("Ort")) {
pizzeria.showFromCity(job[1]);
}
pizzeria.showCustomers();
// pizzeria.showMeals();
// pizzeria.showOrders();
System.out
.println("\n------------------------------------------------------");
}
/**
* Adds the customer.
*
* @param name
* the name
* @param plz
* the plz
* @param ort
* the ort
*
* @return the kunde
*/
public Kunde addCustomer(String name, String plz, String ort) {
Kunde neuerKunde = null;
Session sess = null;
Transaction trx = null;
try {
// sess = persistenz.getSessionKunden();
sess = persistenz.getSessionFactory().openSession();
trx = sess.beginTransaction();
Kunde kunde = new Kunde();
kunde.setDatum(new Date());
kunde.setName(name);
kunde.setOrt(ort);
kunde.setPlz(plz);
sess.save(kunde);
neuerKunde = kunde;
trx.commit();
} catch (HibernateException e) {
if (trx != null) {
trx.rollback();
throw e;
}
} finally {
try {
// if (sess != null)
// sess.close();
} catch (Exception exCl) {
}
}
return neuerKunde;
}
/**
* Delete customer.
*
* @param kunde
* the kunde
*/
@SuppressWarnings("unchecked")
public void deleteCustomer(Kunde kunde) {
Session sess = null;
Transaction trx = null;
try {
sess = persistenz.getSessionKunden();
// sess = persistenz.getSessionFactory().openSession();
trx = sess.beginTransaction();
sess.lock(kunde, LockMode.UPGRADE);
sess.delete(kunde);
trx.commit();
} catch (HibernateException e) {
if (trx != null) {
System.out.println("Der Kunde konnte nicht gelöscht werden.");
trx.rollback();
throw e;
}
} finally {
try {
// if (sess != null)
// sess.close();
} catch (Exception exCl) {
}
}
}
/**
* Change customer.
*
* @param kunde
* the kunde
* @param name
* the name
* @param plz
* the plz
* @param ort
* the ort
*/
@SuppressWarnings({ "unchecked", "deprecation" })
public void changeCustomer(Kunde kunde, String name, String plz, String ort) {
Session sess = null;
Transaction trx = null;
try {
sess = persistenz.getSessionKunden();
sess.reconnect();
// sess = persistenz.getSessionFactory().openSession();
trx = sess.beginTransaction();
kunde.setName(name);
kunde.setPlz(plz);
kunde.setOrt(ort);
sess.update(kunde);
trx.commit();
//System.out.println(sess.id.toString());
} catch (HibernateException e) {
if (trx != null) {
trx.rollback();
throw e;
}
} finally {
try {
// if (sess != null)
// sess.close();
} catch (Exception exCl) {
}
}
sess.disconnect();
}
Name and version of the database you are using:MySQL 5.0.67-community-nt[/code]