> Inhalt: JavaScout-Fat-Client-Framework (JS-FCF) 

> Verzeichnis der Dokumente mit den Muster-Codes 

Muster-Code für ein BO (Generelle Klasse eines Business-Object)

* Bitte beachten Sie die Hinweise und Bestimmungen bezüglich Urheberrecht, Haftungsausschluß und geschützte Marken oder Warenzeichen die für dieses Web-Dokument und möglicherweise auch für 'verlinkte' Dokumente gelten.

  • Der Betreiber dieser Web-Site (www.javascout.biz) ist nicht verantwortlich für den Inhalt von Web-Sites, die innerhalb dieses Web-Dokumentes oder anderer Dokumente von www.javascout.biz verlinkt sind.

  • Wenn dieses Web-Dokument oder andere Dokumente dieser Web-Site (www.javascout.biz) Rechte von Ihnen verletzen, oder sie glauben, dass Rechte Anderer (Dritter Personen) dadurch verletzt werden, informieren Sie bitte den Betreiber dieser Web-Site.
    Eine E-Mail können Sie ganz einfach durch anklicken des Symbols oder Textes im Frame rechts oben senden.

Dieses Dokument drucken.

 Letzte Bearbeitung dieses  Dokuments:
2011-12-15

Voraussetzungen für das Verständnis dieses Dokuments:

Grundkenntnisse in der Programmierung von Java (Klassen, Methoden, Schleifen).
Grundkenntnisse der SQL-Kommandos für relationale Datenbanksysteme.

Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:

Arbeitszeit:
Abhängig von der Anzahl der Variablen in der zu entwickelnden BO-Klasse.
Nach einiger Routine sind ca. 5 Minuten für allgemeine Arbeiten (Eröffnen der Klasse) und ca. 5 Minuten pro Variable zu kalkulieren.

Dieses Dokument enthält Code-Muster für eine einfache Generelle Klasse eines BO (Business-Object) und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.

Inhaltsverzeichnis:

Vorbedingung 

Einfacher Muster-Code für ein BO 
Muster-Code für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter'
 


Anleitung zur Adaptierung 
* Änderung des Namens der Java-Packages der Anwendung 
* Adaptieren des Kommentars 
* Änderung des Namens der Klasse 
* Parameter-Name bei Verwendung von
Parameter_DBA festlegen 
* Definitionen der Variablen des BO 
* Definitionen der Konstanten für Status-Codes 

* Variable in den Methoden copyFromapplication_entity_BO(..) und isDifferent(...) adaptieren 
* Methode getDBAAttributes(...) adaptieren

Spezieller Muster-Code 
* Objekte als Variable dieses BO definieren 
* Objekte als Variable dieses BO kopieren 
* Objekte als Variable dieses BO auf Unterschiede prüfen 
* Prüfen auf Konsistenz der Werte dieses BO 

Weitere Schritte und verwandte Dokumentation 

Vorbedingung:

zum Inhaltsverzeichnis

Einfacher Muster-Code für ein BO

Welche Platzhalter durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind finden Sie im Abschnitt
Anleitung zur Adaptierung.

package application_package.bo;
/*
 * Klasse für die Serialization eines Objekts dieser Klasse.
 * Serialization ist notwendig um ein BO vom Java Application Server (JAS)
 * zum Client zu übertragen.
*/
import java.io.Serializable;
/*
 * Klassen für den Vergleich von Arrays.
 * Diese Klasse ist notwendig wenn Arrays elementarer Typen (z.B. byte[])
 * verglichen werden müssen.
*/
import java.util.Arrays;
/*
 * Package mit der Basisklasse für ein Business Objekt. */

import js_base.bo.JSBS_BO;
/* Package mit der Klasse für das DBA- (DataBase-Access-) Objekt. */
import application_package.dba.*;
/**
 * 
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  Generelle Klasse für ein Business-Object (BO) für einen xxx.
 *  Ein xxx ist ein . . . .
 *  Variablen dieses BO und deren Beschreibung finden Sie gleich
 *  unterhalb der Klassen-Definition.
 *  
 *  Anwender-bekannte-Identifikation:
 *      
VariableName, VariableName
 *  
 *  Weitere Variablen, deren Werte-Kombination einmalig sein muss:
 *      
VariableName, VariableName
 * 
 * @change-log
 * when          who                       why
 * -----------------------------------------------------------------
 * 
 */
public class application_entity_BO extends JSBS_BO implements Serializable {
/*
 * VARIABLE dieses Business-Object.
 * --------------------- */

/* 
 * Beschreibung der Variable ... . */

    
public String VariableName "";
/*
 * KONSTANTEN für die nicht erwarteten Stati
beim Ausführen einer Methode
 * dieses Business-Object. Diese Stati gelten nur für dieses BO.
 *
 * In den Basisklassen werden die Werte 0 bis 10 verwendet.

 * --------------------- */
/* Beschreibung der Konstante ... . */
    
public static final int CONST_Error_Reason = 40;
/*
 * Eine besondere Bedeutung haben 'Fehler' die das 'Deaktivieren' des BO verhindern.
 * Diese Stati gelten nur für dieses BO.

 * --------------------- */
/* Beschreibung warum das BO nicht deaktiviert werden kann . */
    
public static final int CONST_DEAKTIVATE_INHIBIT_REASON_Reason = 60;
/*
 * METHODEN */

/* ---------------------
 * METHODE zum Kopieren der Attribute eines anderen Objekts dieser Klasse. */

    
public void copyFromapplication_entity_BO(
                  
application_entity_BO parmapplication_entity_BO) {
/*
 * Prüfen ob als Parameter ein 'null'-Wert übergeben wurde und
 * behandeln dieses Fehlers. */

      
if(parmapplication_entity_BO == null) {
        
StatusCode = CONST_DB_UNKNOWN_ERROR;
        
StatusMsg = "CopyFrom-Method found 'null' as parameter.";
        
return;
      }
/*
 * Aufruf der Methode der Superklasse um die 'Common Attributes', den Status-Code
 * und die (eventuelle) Fehler-Meldung zu kopieren. */

      
super.copyFromJSBS_BO(parmapplication_entity_BO);
/* 
 * Spezifische Werte für dieses BO übertragen. */
      this.VariableName = parmapplication_entity_BO.VariableName;
    }
/* ---------------------
 * METHODE zum Vergleichen der Werte der speziellen Variablen
 * zweier Business-Object dieser Klasse.
 * Die Methode liefert 'true' zurück wenn mindestens die Werte einer Variablen
 * verschieden sind. */

    
public boolean isDifferent(
                    
application_entity_BO parmapplication_entity_BO) {
/* 
 * Wenn der Parameter 'null' ist dann 'true' (verschieden) zurück liefern. */

      
if (parmapplication_entity_BO == null) return true;
/* 
 * Werte der spezifischen Variablen dieser BO-Klasse vergleichen. */

/* 
 * Vergleich zweier Werte eines elementaren Typs. */

      
if (this.VariableName != parmapplication_entity_BO.VariableName) return true;
/* 
 * Vergleich zweier Werte der Klasse 'String';
 * dieser Vergleich kann auch für andere Variable, die durch eine Klasse repräsentiert werden,
 * verwendet werden. */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (this.VariableName.compareTo(
              parm
application_entity_BO.VariableName ) != 0) return true;
      }
/* 
 * Vergleich zweier Werte die als Array von elementaren Typen repräsentiert werden.
 * In diesem Beispiel wird byte[] verwendet – 'byte' kann auch durch einen anderen
 * elementaren Typ ersetzt werden. */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (! Arrays.equals(this.VariableName, parmapplication_entity_BO.VariableName)) return true;
      }
/* 
 * Für den Vergleich der Werte spezieller Klassen (z.B. BigDecimal) sind unter Umständen
 * Angaben der Rundungs-Genauigkeit notwendig.  */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (this.VariableName.compareTo(parmapplication_entity_BO.VariableName) != 0) return true;
      }
/* 
 * Alle Variablen haben gleiche Werte – BO sind nicht verschieden. */

      
return false;
    }
/* ---------------------
 * METHODE zum Übertragen der Werte der Variablen des zugehörigen DBA-Objekts. */

    
public void getDBAAttributes(application_dbtable_DBA parmapplication_dbtable_DBA) {
/*
 * Aufruf der Methode der Superklasse um die 'Common Attributes'
 * und die (eventuelle) Fehler-Meldung zu kopieren. */

      
super.getCommonDBAAttributes(parmapplication_dbtable_DBA);
/* 
 * Spezifische Werte für dieses BO übertragen. */
      this.VariableName = parmapplication_dbtable_DBA.VariableName;
    }
/* ---------------------
 * METHODE zum Prüfen auf Konsistenz der Daten dieses BO.
 
 *
 
 * Diese Methode ist dazu gedacht, eine Prüfung auf Korrektheit der Werte dieses BO durchzuführen
 
 * bevor die Daten gespeichert werden.
 
 * Eine Prüfung der Konsistenz der Daten ist dann erforderlich
 * * wenn nicht sicher gestellt werden kann, dass bei der Eingabe der Daten die Prüfungen durchgeführt werden
 * oder
 * * wenn die Prüfungen so komplex sind, dass sie bei der Eingabe nicht vollständig durchgeführt werden können.
  
 *

 * Wenn die Prüfregeln nicht erfüllt werden, kann als genereller Status-Code die Konstante 
 * CONST_INCONSISTENT_DATA (aus der Basisklasse JSBS_BO)
verwendet werden oder es können in dieser Klasse 
 * detailliertere Konstante für den Status-Code definiert werden.
 
 *
 
 * Für Prüf-Algorithmen, die Werte anderer Business-Objects erfordern (und damit auf die Datenbank)
 
 * zugreifen müssen) kann diese Methode in der Klasse für das Server-Seitige BO (BOS)
 
 * überschrieben werden. */

    
public boolean isConsistentData() {
/*
 * Anschließend ist der Algorithmus. */

      
/* 
 * Wenn in dieser Methode keine Prüfungen durchgeführt werden, werden die Daten
 
 * als 'konsistent' betrachtet. */
      return true;
    }
}

zum Inhaltsverzeichnis

Muster-Code für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter'

Die Datenbank-Tabelle Parameter ist dafür vorgesehen, BO abzuspeichern für deren Klasse keine größeren Mengen erwartet werden.

Typisch dafür sind Einstellungen für das Anwendungsprogramm oder Werte für Kategorien (z.B. die Branche von Kunden).
Im JavaScout Base-System (JSBS) ist eine DataBase-Access (DBA) Klasse implementiert, die Zugriffe auf diese Tabelle ('Parameter') implementiert hat.

Der folgende Muster-Code ist für ein BO, das für die Datenspeicherung die Tabelle 'Parameter' verwendet.

Welche Platzhalter durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind finden Sie im Abschnitt
Anleitung zur Adaptierung .

package application_package.bo;
/*
 * Klasse für die Serialization eines Objekts dieser Klasse.
 * Serialization ist notwendig um ein BO vom Java Application Server (JAS)
 * zum Client zu übertragen.
*/
import java.io.Serializable;
/*
 * Klassen für den Vergleich von Arrays.
 * Diese Klasse ist notwendig wenn Arrays elementarer Typen (z.B. byte[])
 * verglichen werden müssen.
*/
import java.util.Arrays;
/*
 * Package mit der Basisklasse für ein Business Objekt. */

import js_base.bo.JSBS_BO;
/* Package mit der Klasse für das DBA- (DataBase-Access-) Objekt für den
 * Zugriff auf die DB-Tabelle 'Parameter'. */

import js_base.dba.*;
/**
 * 
 * @author name[at]company
 * @date 20xx-xx-xx
 *
 * @description
 *  Generelle Klasse für ein Business-Object (BO) für einen xxx.
 *  Ein xxx ist ein . . . .
 *  Variablen dieses BO und deren Beschreibung finden Sie gleich
 *  unterhalb der Klassen-Definition.
 *  
 *  Anwender-bekannte-Identifikation:
 *      
VariableName, VariableName
 *  
 *  Weitere Variablen, deren Werte-Kombination einmalig sein muss:
 *      
VariableName, VariableName
 * 
 * @change-log
 * when          who                       why
 * -----------------------------------------------------------------
 * 
 */
public class application_entity_BO extends JSBS_BO implements Serializable {
/*
 * PARAMETER_IDENTIFIKATION unter dem Business-Objects dieser Klasse auf der
 * DB-Tabelle 'Parameter' abgespeichert sind.
 * --------------------- */

    
public static final String CONST_PARAMETER_NAME = "ParameterName";
/*
 * VARIABLE dieses Business-Object.
 * --------------------- */

/* Beschreibung der Variable ... . */
    
public String VariableName;
/*
 * KONSTANTEN für die nicht erwarteten Stati
beim Ausführen einer Methode
 * dieses Business-Object. Diese Stati gelten nur für dieses BO.
 *
 * In den Basisklassen werden die Werte 0 bis 10 verwendet.

 * --------------------- */
/* Beschreibung der Konstante ... . */
    
public static final int CONST_Error_Reason = 40;
/*
 * Eine besondere Bedeutung haben 'Fehler' die das 'Deaktivieren' des BO verhindern.
 * Diese Stati gelten nur für dieses BO.

 * --------------------- */
/* Beschreibung warum das BO nicht deaktiviert werden kann . */
    
public static final int CONST_DEAKTIVATE_INHIBIT_REASON_Reason = 60;
/*
 * METHODEN */

/* ---------------------
 * METHODE zum Kopieren der Attribute eines anderen Objekts dieser Klasse. */

    
public void copyFromapplication_entity_BO(
                  
application_entity_BO parmapplication_entity_BO) {
/*
 * Prüfen ob als Parameter ein 'null'-Wert übergeben wurde und
 * behandeln dieses Fehlers. */

      
if(parmapplication_entity_BO == null) {
        
StatusCode = CONST_DB_UNKNOWN_ERROR;
        
StatusMsg = "CopyFrom-Method found 'null' as parameter.";
        
return;
      }
/*
 * Aufruf der Methode der Superklasse um die 'Common Attributes', den Status-Code
 * und die (eventuelle) Fehler-Meldung zu kopieren. */

      
super.copyFromJSBS_BO(parmapplication_entity_BO);
/* 
 * Spezifische Werte für dieses BO übertragen. */
      this.VariableName = parmapplication_entity_BO.VariableName;
    }
/* ---------------------
 * METHODE zum Vergleichen der Werte der speziellen Variablen
 * zweier Business-Object dieser Klasse.
 * Die Methode liefert 'true' zurück wenn mindestens die Werte einer Variablen
 * verschieden sind. */

    
public boolean isDifferent(
                    
application_entity_BO parmapplication_entity_BO) {
/* 
 * Wenn der Parameter 'null' ist dann 'true' (verschieden) zurück liefern. */

      
if (parmapplication_entity_BO == null) return true;
/* 
/* 
 * Vergleich zweier Werte eines elementaren Typs. */

      
if (this.VariableName != parmapplication_entity_BO.VariableName) return true;
/* 
 * Vergleich zweier Werte der Klasse 'String';
 * dieser Vergleich kann auch für andere Variable, die durch eine Klasse repräsentiert werden,
 * verwendet werden. */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (this.VariableName.compareTo(
              parm
application_entity_BO.VariableName) != 0) return true;
      }
/* 
 * Vergleich zweier Werte die als Array von elementaren Typen repräsentiert werden.
 * In diesem Beispiel wird byte[] verwendet – 'byte' kann auch durch einen anderen
 * elementaren Typ ersetzt werden. */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (! Arrays.equals(this.VariableName, parmapplication_entity_BO.VariableName)) return true;
      }
/* 
 * Für den Vergleich der Werte spezieller Klassen (z.B. BigDecimal) sind unter Umständen
 * Angaben der Rundungs-Genauigkeit notwendig.  */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (this.VariableName.compareTo(parmapplication_entity_BO.VariableName) != 0) return true;
      }
/* 
 * Alle Variablen haben gleiche Werte – BO sind nicht verschieden. */

      
return false;
    }
/* ---------------------
 * METHODE zum Übertragen der Werte der Variablen des zugehörigen DBA-Objekts (Parameter). */

    
public void getDBAAttributes(JSBS_Parameter_DBA parmParameter_DBA) {
/*
 * Aufruf der Methode der Superklasse um die 'Common Attributes'
 * und die (eventuelle) Fehler-Meldung zu kopieren. */

      
super.getCommonDBAAttributes(parmParameter_DBA);
/* 
 * Spezifische Werte für dieses BO übertragen. */

/* 
 * Übertragen der Werte bei einem 'String'. */
      this.VariableName = parmParameter_DBA.ValueXX;
/* 
 * Für numerische Werte muss der 'String' aus dem Attribut der 'Parameter'-Tabelle
 * wieder 'umgewandelt' werden.
 * Zuerst das Umwandeln in ein 'BigDecimal'.
 * Das erfolgt innerhalb einer 'try/catch'-Logik um fehlerhafte Werte in dem 'String'
 * behandeln zu können. */
      try {
        this.VariableName = new BigDecimal(parmParameter_DBA.ValueXX.trim());
      }
/* Wenn der 'String'-Wert keinen numerischen Wert enthält dann wird der 'catch'-Zweig
 * ausgeführt. */
      catch (Exception Exc) {
/* In diesem Beispiel wird der Variable der Wert '0' zugewiesen.
 * Abhängig von der Anforderung kann hier auch eine andere Verarbeitung codiert werden. */
        this.VariableName = new BigDecimal(0);
      }
/* 
 * In den folgenden Beispielen ist die 'try/catch'-Logik in weniger Zeilen untergebracht.
 * Ein Beispiel für (die Klasse) 'Integer'; ähnlich auch für 'Short' und 'BigInteger'. */
      try {this.VariableName = new Integer(parmParameter_DBA.ValueXX.trim());}
      catch {(Exception Exc) {this.VariableName = new Integer(0);}
/* 
 * Für Variable elementarer Typen muss bei der Umwandlung zuerst die adäquate Klasse
 * verwendet werden.
 * Ein Beispiel für (den elementaten Typ) 'int'; ähnlich auch für 'short' und 'long'. */
      try {this.VariableName = new (Integer(parmParameter_DBA.ValueXX.trim()))intValue();}
      catch {(Exception Exc) {this.VariableName = 0;}
      try {this.VariableName = new (Short(parmParameter_DBA.ValueXX.trim()))shortValue();}
      catch {(Exception Exc) {this.VariableName = 0;}
      try {this.VariableName = new (BigInteger(parmParameter_DBA.ValueXX.trim()))longValue();}
      catch {(Exception Exc) {this.VariableName = 0;}
    }
/* ---------------------
 * METHODE zum Prüfen auf Konsistenz der Daten dieses BO.
 
 *
 
 * Diese Methode ist dazu gedacht, eine Prüfung auf Korrektheit der Werte dieses BO durchzuführen
 
 * bevor die Daten gespeichert werden.
 
 * Eine Prüfung der Konsistenz der Daten ist dann erforderlich wenn nicht sicher gestellt werden kann,
 
 * dass bei der Eingabe der Daten die Prüfungen durchgeführt werden oder wenn die Prüfungen so komplex
 
 * sind, dass sie bei der Eingabe nicht vollständig durchgeführt werden können.
  
 *

 * Wenn die Prüfregeln nicht erüllt werden kann als genereller Status-Code die Konstante 
 * CONST_INCONSISTENT_DATA (aus der Basisklasse JSBS_BO)
verwendet werden oder es können in dieser Klasse 
 * detailliertere Konstante für den Status-Code definiert werden.
 
 *
 
 * Für Prüf-Algorithmen, die Werte anderer Business-Objects erfordern (und damit auf die Datenbank
 
 * zugreifen müssen) kann diese Methode in der Klasse für das Server-Seitige BO (BOS)
 
 * überschrieben werden. */

    
public boolean isConsistentData() {
/*
 * Anschließend ist der Algorithmus. */

      
/* 
 * Wenn in dieser Methode keine Prüfungen durchgeführt werden, werden die Daten
 
 * als 'konsistent' betrachtet. */
      return true;
    }
}

zum Inhaltsverzeichnis

Anleitung zur Adaptierung

Am leichtesten funktioniert die Anpassung des Muster-Codes an die eigenen Erfordernisse durch Kopieren des Muster-Codes und Verwendung von Edit > Find/Replace... .

Wenn vorher der zu ersetzende Text markiert wurde, wird er zu findende Text von der Suchfunktion übernommen.

Für 'Platzhalter', die nur einmalig im Muster-Code vorkommen ist die 'Find'-Funktion ist hilfreich zum Finden der beschriebenen 'Platzhalter'.

zum Inhaltsverzeichnis

Änderung des Namens der Java-Packages der Anwendung

package application_package.bo;
. . . . .
. . . . .
/*
 * Package mit der Basisklasse für ein Business Objekt. */

import js_base.bo.JSBS_BO;
/* Package mit der Klasse für das DBA- (DataBase-Access-) Objekt. */
import application_package.dba.*;
/**

Der Name dieses Packages kommt in der ersten Zeile des Muster-Codes vor.
Ein zeitsparendes Vorgehen ist, beim Kopieren des Muster-Codes diese Zeile nicht zu überschreiben und dann die Zeile des Muster-Codes mit dem Platzhalter für den Namen des Java-Packages zu löschen.

Wenn den Namenskonventionen gefolgt wurden, dann ist auch der Name des Packages mit den DBA-Klassen im ersten Teil gleich.
Ansonsten ist der Name des Java-Packages mit der (oder den – bei mehreren) zugeordneten DBA-Klasse(n) anzugeben.

zum Inhaltsverzeichnis

Adaptieren des Kommentars

'Kein Kommentar ist besser als ein falscher'.

Aus diesem Grund ist im Muster-Code auch keine Hintergrund-Information über Entwurfs-Entscheidungen für das BO vorhanden.
Meiner Erfahrung nach ist hilfreich, im Kommentar zu sehen, welche Variable jenen Schlüssel bilden, mit denen der Anwender ein Business-Object eindeutig identifizieren kann.

zum Inhaltsverzeichnis

Änderung des Namens der Klasse

 */
public class application_entity_BO extends JSBS_BO implements Serializable {
/*

Dieser Name muss mit dem Namen der Klasse übereinstimmen, der beim Eröffnen der Klasse gewählt wurde.

Der Name der Klasse kommt mehrmals im gesamten Code vor.
Deswegen empfehle ich, mit 'Find/Replace' alle Platzhalter
application_entity_BO im Muster-Code durch den gewählten Klassen-Namen zu ersetzen.

zum Inhaltsverzeichnis

Parameter-Name bei Verwendung von Parameter_DBA festlegen

Diese Änderung ist nur notwendig, wenn der Muster-Code für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter' als Vorlage verwendet wurde.

public class application_entity_BO extends JSBS_BO {
/*
 * PARAMETER_IDENTIFIKATION unter dem Business-Objecte dieser Klasse auf der
 * DB-Tabelle 'Parameter' abgespeichert sind.
 * --------------------- */

    
protected static final String CONST_PARAMETER_NAME = "ParameterName";
/*
 * VARIABLE dieses Business-Object.

Dieser Name darf von keiner anderen BO-Klasse verwendet werden.

Der Name der Klasse kommt nur einmal im gesamten Code vor – gleich nach der Definition des Namens der Klasse.
Deswegen empfehle ich, mit 'Find/Replace' alle Platzhalter
application_entity_BO im Muster-Code durch den gewählten Klassen-Namen zu ersetzen.

zum Inhaltsverzeichnis

Definitionen der Variablen des BO

/*
 * VARIABLE dieses Business-Object.
 * --------------------- */

/* 
 * Beschreibung der Variable ... . */

    
public String VariableName;
/*

In diesem Teil werden die Geschäfts-spezifischen Variablen des BO definiert.
Im Muster-Code ist nur eine einfache Klasse (
String) enthalten – es ist aber auch möglich, eigene Klassen mit komplexen Strukturen als Variable zu definieren.
Beispiele dazu finden Sie im Abschnitt
Objekte als Variable dieses BO.

zum Inhaltsverzeichnis

Definitionen der Konstanten für Status-Codes

/*
 * KONSTANTEN für die nicht erwarteten Status
beim Ausführen einer Methode
 * dieses Business-Object. Diese Stati gelten nur für dieses BO.

 * --------------------- */
/* Beschreibung der Konstante ... . */
    
public static final int CONST_Error_Reason;
/*
 * Eine besondere Bedeutung haben 'Fehler' die das 'Deaktivieren' des BO verhindern.
 * Diese Stati gelten nur für dieses BO.

 * --------------------- */
/* Beschreibung warum das BO nicht deaktiviert werden kann . */
    
public static final int CONST_DEAKTIVATE_INHIBIT_REASON_Reason;
/*

In diesem Teil werden Status-Codes, die nicht allgemein - und damit in der geerbten Basisklasse JSBS_BO - definiert sind, definiert.
Die Definition der Status-Codes ist individuell von der Funktionalität des BO abhängig und des wegen wird auf eine generelle Anleitung verzichtet.

Status-Codes für das Verhindern der Deaktivierung des BO (public static final int CONST_DEAKTIVATE_INHIBIT_REASON_Reason;) werden vermutlich erst mit der Analyse und Implementierung anderer BO notwendig werden wenn das neue BO durch eine Fremdschlüssel-Relation zu einer oder mehreren Variablen dieses BO abhängig ist.

Das 'Deaktivieren' des BO ist in der Methode deaktivate(...) der zugehörigen Server-Side-Klasse des BO implementiert.
Mehr Information finden Sie im Dokument 
Muster-Code für ein BOS (Server-Side-Klasse eines Business-Object).

zum Inhaltsverzeichnis

Variable in den Methoden copyFromapplication_entity_BO(...) und isDifferent(...) adaptieren

/*
 * METHODEN */

/* ---------------------
 * METHODE zum Kopieren der Attribute eines anderen Objekts dieser Klasse. */
    public void copyFromapplication_entity_BO(
                  
application_entity_BO parmapplication_entity_BO) {
/*
 * Aufruf der Methode der Superklasse um die 'Common Attributes', den Status-Code
 * und die (eventuelle) Fehler-Meldung zu kopieren. */

      super.getJSBS_BO(parmapplication_entity_BO);
/* 
 * Spezifische Werte für dieses BO übertragen. */
      this.VariableName = parmapplication_entity_BO.VariableName;
    }

/* ---------------------
 * METHODE zum Vergleichen der Werte der speziellen Variablen
 * zweier Business-Object dieser Klasse.
 * Die Methode liefert 'true' zurück wenn mindestens die Werte einer Variablen
 * verschieden sind. */

    
public boolean isDifferent(
                    
application_entity_BO parmapplication_entity_BO) {
/* 
 * Wenn der Parameter 'null' ist dann 'true' (verschieden) zurück liefern. */

      
if (armapplication_entity_BO_Set == null) return true;
/* 
 * Werte der spezifischen Variablen dieser BO-Klasse vergleichen. */

/* 
 * Vergleich zweier Werte eines elementaren Typs. */

      
if (this.VariableName != parmapplication_entity_BO.VariableName) return true;
/* 
 * Vergleich zweier Werte der Klasse 'String';
 * dieser Vergleich kann auch für andere Variable, die durch eine Klasse repräsentiert werden,
 * verwendet werden. */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (this.VariableName.compareTo(
              parm
application_entity_BO.VariableName) != 0) return true;
      }
/* 
 * Vergleich zweier Werte die als Array von elementaren Typen repräsentiert werden.
 * In diesem Beispiel wird byte[] verwendet – 'byte' kann auch durch einen anderen
 * elementaren Typ ersetzt werden. */

/* Zuerst prüfen, ob eine der beiden Variablen 'null' ist. */
      
if ((this.VariableName == null) || (parmapplication_entity_BO.VariableName == null)) {
/* Prüfen, ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'. */
        
if ((this.VariableName == null) && (parmapplication_entity_BO.VariableName == null)) {
/* Beide Variablen sind 'null' - damit ist der Vergleich 'erfüllt'. */
        }
        else {
/* Logischerweise kann nur eine der beiden Variablen 'null' sein;
 * damit gelten die beiden Variablen als 'verschieden. */

          
return true;
        }
      }
      else {
/* Keine der beiden Variablen ist 'null';
 * damit können die Werte der Variablen verglichen werden. */

        
if (! Arrays.equals(this.VariableName, parmapplication_entity_BO.VariableName)) return true;
      }
/* 
 * Für den Vergleich der Werte spezieller Klassen (z.B. BigDecimal) sind unter Umständen
 * Angaben der Rundungs-Genauigkeit notwendig.
 *   */

      
if (this.VariableName.compareTo != parmapplication_entity_BO.VariableName) return true;
/* Alle Variablen haben gleiche Werte – BO sind nicht verschieden. */
      
return false;
    }

In den beiden Methoden müssen für jede Geschäfts-spezifische Variable die entsprechenden Code-Zeilen zum Kopieren des Wertes bzw. zum Prüfen des Unterschiedes von Werten eingefügt werden.

Das Ersetzen des Platzhalters  ist bereits erfolgt wenn Sie das im Abschnitt Änderung des Namens der Klasse beschriebenen Verfahren durchgeführt haben.

Beispiele für das Kopieren und Überlegungen zum Vergleichen ganzer Objekte finden Sie unter Objekte als Variable dieses BO kopieren bzw. Objekte als Variable dieses BO auf Unterschiede prüfen.

zum Inhaltsverzeichnis

Methode getDBAAttributes(...) adaptieren

Wenn der Muster-Code für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter' als Vorlage verwendet wurde dann ist die Klasse des übergebenen Parameters (JSBS_Parameter_DBA) schon bestimmt.

/* ---------------------
 * METHODE zum Übertragen der Werte der Variablen des zugehörigen DBA-Objekts. */

    
public void getDBAAttributes(application_dbtable_DBA parmapplication_dbtable_DBA) {
/*
 * Aufruf der Methode der Superklasse um die 'Common Attributes'
 * und die (eventuelle) Fehler-Meldung zu kopieren. */

      
super.getCommonDBAAttributes(parmapplication_dbtable_DBA);
/* 
 * Spezifische Werte für dieses BO übertragen. */
      this.VariableName = parmapplication_dbtable_DBA.VariableName;
    }

Der Platzhalter für den Namen des DBA-Objekts (application_dbtable_DBA) ist durch den gültigen Namen zu ersetzen.

Für jede Variable der DBA-Klasse ist zu definieren, auf welche Variable der BO-Klasse der Wert übertragen wird.

zum Inhaltsverzeichnis

Spezieller Muster-Code

In diesem Teil wird Muster-Code vorgestellt, der nicht in jeder Generellen Klasse eines BO vorkommen wird und deswegen nicht in den Muster-Code der Klasse aufgenommen wurde.

zum Inhaltsverzeichnis

Objekte als Variable dieses BO definieren

public JS_HSepp_Lieferort_BO structJS_HSepp_Lieferort_BO = new JS_HSepp_Lieferort_BO();
public JS_HSepp_BestellPosition_Set_BO structJS_HSepp_BestellPosition_Set_BO =
                                                 
new JS_HSepp_BestellPosition_Set_BO();

Neben einfachen Typen und Klassen aus der Java-Standard-Bibliothek (z.B. 'String' oder 'BigDecimal') kann jede beliebige Klasse für eine Variable eines BO herangezogen werden.

Das gezeigte Beispiel ist ein Ausschnitt auf dem BO für eine Bestellung eines Kunden.
Das BO-Klasse enthält die Lieferadresse und die Liste mit den Positionen der Bestellung als Variablen, die wieder Klassen der Anwendung sind.

zum Inhaltsverzeichnis

Objekte als Variable dieses BO kopieren

if (parmJS_HSepp_Bestellung_BO.structJS_HSepp_Lieferort_BO == null) {
  
this.structJS_HSepp_Lieferort_BO = null;
}
else (JS_HSepp_Bestellung_BO.structJS_HSepp_Lieferort_BO == null) {
  
this.structJS_HSepp_Lieferort_BO = new JS_HSepp_Bestellung_BO();
  
this.structJS_HSepp_Lieferort_BO.copyFromJS_HSepp_Bestellung_BO(
                                   parmJS_HSepp_Bestellung_BO.
structJS_HSepp_Lieferort_BO);
}

Der oben vorgestellte Muster-Code wird in der Methode copyFromapplication_entity_BO(...) implementiert.
Nach einer Prüfung ob das Variablen-Objekt nicht
null ist, wird die Methode der Klasse benutzt, um die Werte des Objektes zu kopieren.

zum Inhaltsverzeichnis

Objekte als Variable dieses BO auf Unterschiede prüfen

Für den Vergleich von 2 Objekten, die als Variablen von BO definiert sind, müssen mehrere Überlegungen in Betracht gezogen werden, bevor die bei der Klasse implementierte Methode isDifferent(...) aufgerufen werden kann:

zum Inhaltsverzeichnis

Prüfen auf Konsistenz der Werte dieses BO

Im Muster-Code ist die Methode public boolean isConsitentData() enthalten - aber kein Algorithmus für eventuelle Prüfungen enthalten.
Prüfregeln müssen auf die jeweilige Aufgabe des BO abgestimmt sein, ein Algorithmus-Schema würde den verschiedenartigen Aufgaben nicht gerecht und deswegen wird auf einen Beispiel-Algorithmus verzichtet.

zum Inhaltsverzeichnis

Weitere Schritte und verwandte Dokumentation

Dokument

Inhalt

Tutorial: JavaScout ProjectAssist (Java_Fatclient_01) – General BO (Business-Object) Klasse für 'ProjectLanguage'  

Schritt desTutorials für die Entwicklung von Heavyweight-Client Anwendungen in dem die Implementierung der Generellen Klasse für das BO vorgestellt wird.

Muster-Code für ein BO_Set (Liste mit Business-Objects)  

Muster-Code für die BO-Klasse, mit denen eine Liste von Datensätzen selektiert werden kann.
Die Verwendung dieser Klasse ist notwendig, wenn durch die Selektionskriterien mehr als ein Datensatz ausgewählt werden kann.

zum Inhaltsverzeichnis