-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Locking in Hibernate - allgemeine Frage
PostPosted: Thu Nov 06, 2008 5:15 am 
Newbie

Joined: Thu Nov 06, 2008 4:34 am
Posts: 1
Location: Aachen
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]

_________________
Grüße, Krista


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.