Sunday, May 18, 2014

Propositional Logic Grammar Implementation in ANTLR


Here we have Propositional Logic BNF Grammar. We will implement this grammar in ANTLR project.


BNF of propositional logic grammar

We want to enter one or more statement. So we declare that prog rule is stat+.

prog  :  stat+  ;
 We want to finish the sentence with newline and user can just enter just newline character. Newline is a non termina so we declare newline with upper cases. Rules are written wth lower cases.

stat  :   sentence NEWLINE  | NEWLINE  ;
 Sentence may be atomcsentence or complexsentence.
sentence  :  atomicsentence  | complexsentence  ; 
Atomicsentence may be true value or false value or Symbol.
atomicsentence  :  'true'  | 'false'  | SYMBOL  ;
Symbol may be q or r or p value. 
SYMBOL  :  'q'  | 'r'  | 'p'  ;
Complexsentence may be not (~)sentence or (sentence && sentence) or (sentence ||sentence) or (sentence -> sentence ) or (sentence <-> sentence).

complexsentence  :  '~' sentence  | '(' sentence  (    '&&'    | '||'    | '->'    | '<->'  )  sentence ')'  ;

NEWLINE
  :
  '\n'+
  ;

WS
  :
  (
    ' '
    | '\t'
  )+
 
   {
    $channel = HIDDEN;
   }
  ;


English Sentence Example ANTLR Project


We will write a grammar that defines rule of English sentence. But we will have additional conditions. 
  • Sentence in English contains noun phrase and verb phrase.
  • Noun phrase contains adjective phrase and noun or just noun or e which shows empty.
  • Adjective phrase contains adjective phrase and adjective or e.
  • Verb phrase containd verb and noun phrase.
  • Verb : contains at least one  just lower case .
  • Adjective : contains at least one just upper case.
  • Noun : contains the first letter upper the others are lower cases.

When we write our grammar we will use White space terminal to specify White space should be used in where. We can say that ignore when White space is seen  but when we want to draw parser tree dynamically interpreter draws wrong but rule Works correct. So to see correct parser tree we will not ignore White  space. 


If a terminal goes to empty we don’t need to declare empty. We we use that terminal we specify it with question mark that means that terminal is used 0 or one time.

Now we declare s : will contain np and WS in paranthesis. And np can go  empty so we write a question mark outside of the paranthes. Then s contains verb phrase. If we want to use java code we can open curly bracet and between them we may write java codes. Here we display sentence. Use dolar sign to specify variables or terminal or non terminals.

s  :  (np WS)? vp              {               if ($np.text != null)                    System.out.print($np.text + " ");               System.out.println($vp.text);              }  ;

First we check noun phrase is null or not. If not we display it’s text. Then we display vp.

Noun phrase contains adjective phrase and noun. Adjective phrases can go empty. And it has left recursion. Antlr doesn’t support left recursion. So  we will use star that means we can use ap zero or more times.
Ap contains just adjective.
np  :  (ap WS)* N  ;
ap  :  A  ;
Verb phrase contains verb then noun phrase. Again noun phase can go empty so we will use again question mark.

vp  :  V (WS np)?  ;

Adjective contains at least one upper case so we will use +. It means at least 1 or more.
A  :  ('A'..'Z')+  ;
Noun will begin with  one beginning upper letter but the others if exist will be lower. So we use . to show one big character, for others we will use star.
N
  :
  ('A'..'Z') . ('a'..'z')*
  ;
Verb will be at least one lower case.
V  :  ('a'..'z')+  ;
White space will be space or tab.
WS  :  (    ' '    | '\t'  )+  ;

Now we write our Test class. First we take sentence from user through JOptionPane. It returns string. But we need to return it Input Stream. Because ANTLRInputStream accepts Input Stream. InputStream is abstract class so we cannot create an instance in this type. We will create ByteArrayInputStream. It takes byte. String class has a getbyte method. So we can use it.
String userin = JOptionPane.showInputDialog(null,                           "Please enter English sentence");              InputStream userinn = new ByteArrayInputStream(userin.getBytes());           
             ANTLRInputStream input = new ANTLRInputStream(userinn);

Then we will create a lexer instance by passing input as parameter.
// Create an ExprLexer that feeds from that stream             EnglishGrammarLexer lexer = new EnglishGrammarLexer(input);

Then we will create a tokens instance by passing lexer instance as parameter.
// Create a streams of tokens fed by the lexer             CommonTokenStream tokens = new CommonTokenStream(lexer);

Then we will create a parser instance by passing tokens instance as parameter.
// Create a parser that feeds off the token stream             EnglishGrammarParser parser = new EnglishGrammarParser(tokens);

Then using parser we will call our rule s.
// Begin parsing at rule s              parser.s();

CREATING ANTLR PROJECT


  1.  Run Eclipse.
  2. File – New – Java Project. (Figure 1)



    Figure 1
  3. Write Project Name – Click Finish button. (Figure 2)



    Figure 2

  4. Right Click over Project – Configure – Convert to ANTLR Project. (Figure 3)



    Figure 3

  5. Right click over src director under your Project. New – Other. (Figure 4)



    Figure 4

  6. Select ANTLR – Combined Grammar – Next. (Figure 5)



    Figure 5

  7. Write grammar Name (for ex. T). Click Finish button. (Figure 6)



    Figure 6

  8. Write your grammar. Then when you save your grammer, TLexer.java, TParser.java files are generated automatically under antlr-generated directory. (Figure 7, 8)


    Figure 7



    Figure 8

  9. Right click over antlr-generated directory. Build Path – Use as Source Folder. (Figure 9)



    Figure 9

  10. After Step 9, Project will give errors. (Figure 10)



    Figure 10

  11. Right click over Project – Build Path – Configure Build Path. (Figure 11)



    Figure 11

  12. Click Add External JARs… button. Find antlr-3.3 jar which is located in advance. (Figure 12)



    Figure 12

  13. Write your Test. Java file under antlr-genereated directory. (Figure 13)



    Figure 13

  14.  Run Test file.  (Figure 14)



    Figure 14

  15. The command is correct. So in the console there is no error message. (Figure 15)



    Figure 15

  16. If we don’t add ‘;’ at the end of the command, it will give error in the console. (Figure 16)



    Figure 16

TESTING AND GETTING PARSER TREES

  1. Open grammar file. Then Click interpreter tab. (Figure 17)



    Figure 17

  2. In opened screen, select rule, then write test command. Then click play button. Parse tree will be displayed. (Figure 18)



    Figure 18

  3. Example of wrong command. (Figure 19)



    Figure 19

  4. Click Railroad View tab. (Figure 20)



    Figure 20

  5. You can save this diagrams as jpeg or png or html pages. (Figure 21)


    Figure 21

1REFERENCES

[1] T. Parr, The Definitive ANTLR Reference, Building Domain-Specific Languges, Dallas, Texas : The Pragmatic Bookshelf , 2007



Saturday, May 17, 2014

What is ANTLR?





INSTALLATION OF ANTLR TO ECLIPSE



  1.  Java should already be installed and classpath setting should be alread made.
  2. You should have a any version of Eclipse.
  3. To install Antlr, first step is to obtain a jar file.  From link given below you can downlaod it. (Figure 1) http://www.java2s.com/Code/Jar/a/Downloadantlr33completejar.htm


    Figure 1
  4.  After downloading the jar file, you should locate it to anywhere you want. For instance, you should create a antlr-3.3 directory under Local Disk C. (Figure 2,  3)



    Figure 2



    Figure 3

  5. Run Eclipse and go Help -> Install New Software. (Figure 4)



    Figure 4
  6. Click Add button on right corner of the screen. You should add repository for needed tools to complete antlr installattion. Name can be Indigo Market or any name you want. Location have to be link given below.  (Figure 5)
    http://download.eclipse.org/releases/indigo



    Figure 5
  7. After adding repository you should install zest, gef and dynamic language toolkit respevtively. In each instalation you should restart eclipse. (Figure 6, 7, 8)




    Figure 6


    Figure 7

    Figure 8

  8.       Then you should install Antlr tool from link given below. (Figure 9)


    Figure 9

  9. Go Window -> Preferences. (Figure 10)

    Figure 10

  10.  Find Builder under ANTLR in the list located on left side on the Preferences Window. To add antlr jar click Add button. (Figure 11)

    Figure 11

  11. Click Directory button. Select antlr jar file which we have already downloaded and located in antlr-3.3 directory under Local Disk (C:). Then Click Ok button. You should see Figure 13. Then click OK button again. (Figure 12, 13)




    Figure 12



    Figure 13

  12.  Then Go Code Generator menu under ANTLR-Builder. Select “Project relative folder” . Write antlr-generated as output folder name. Then select Append java package to output folder under Java part. Click Apply button. (Figure 14)


    Figure 14

  13.  Installation is completed.

REFERENCES


[1] http://vimeo.com/8001326
[2] http://www.antlr3.org/download/
[3] http://stackoverflow.com/questions/8343488/antlr-ide-in-eclipse-doesnt-work
[4] http://antlreclipse.sourceforge.net/


SIMPLE HIBERNATE EXAMPLE IN NETBEANS USING ORACLE

WHAT IS HIBERNATE?

Hibernate ORM (Hibernate in short) is an object-relational mapping library for the Java language, providing a framework for mapping an object-oriented domain model to a traditional relational database [1].
Hibernate's primary feature is mapping from Java classes to database tables (and from Java data types to SQL data types). Hibernate also provides data query and retrieval facilities. It generates SQL calls and relieves the developer from manual result set handling and object conversion. Applications using Hibernate are portable [1].

The Hibernate architecture is layered to keep you isolated from having to know the underlying APIs. Hibernate makes use of the database and configuration data to provide persistence services (and persistent objects) to the application [2].
Following is a very high level view of the Hibernate Application Architecture.



Figure 1 [2]

Persistent Objects

A persistent object is an object that has been assigned a storage location in a federated database. When you commit the transaction in which you create a persistent object, that object's data is saved in the database; the object can then be accessed by other processes. A persistent object continues to exist beyond the duration of the process that creates it. In contrast, a transient object exists only within the memory of the process that creates it; when that process terminates, the transient object ceases to exist [3].

Hibernate Objects

Configuration Object

The Configuration object is the first Hibernate object you create in any Hibernate application and usually created only once during application initialization. It represents a configuration or properties file required by the Hibernate.

SessionFactory Object

Configuration object is used to create a SessionFactory object which inturn configures Hibernate for the application using the supplied configuration file and allows for a Session object to be instantiated. The SessionFactory is a thread safe object and used by all the threads of an application.
You would need one SessionFactory object per database using a separate configuration file. So if you are using multiple databases then you would have to create multiple SessionFactory objects.

Session Object

A Session is used to get a physical connection with a database. The Session object is lightweight and designed to be instantiated each time an interaction is needed with the database. Persistent objects are saved and retrieved through a Session object.

Transaction Object

A Transaction represents a unit of work with the database and most of the RDBMS supports transaction functionality. Transactions in Hibernate are handled by an underlying transaction manager and transaction (from JDBC or JTA) [2].

MYGEDIZ EXAMPLE IN NETBEANS

Create Java Project

In netbeans, we create a new Java Project by choosing New Project choice under File Menu.
(Figure 2)


Figure 2

In displayed window we choose Java Category and Java Application Project. Then Next button is clicked. (Figure 3 )


Figure 3

Write Project name and if you don’t want to have main class automatically, you should unselect Create Main Class option. Then click Finish. We have created a Java Project. (Figure 4)


Figure 4

Add Required Library/Jar

MYGEDIZ Project will use Hibernate framework. So our first job is to add required libraries. Right over click Library directory. Select Add Library. (Figure 5)



Figure 5
Find Hibernate and Hibernate JPA in the list and add them. (Figure 6)


Figure 6
After that using Add JAR/Folder option, we add hibernate3.jar which is previously downloaded by us. You should download from http://www.java2s.com/Code/Jar/h/Downloadhibernate3jar.htm link. (Figure 7)


Figure 7
We should add ojdbc6.jar file too.

Design the Application

Now we can create new JFrame Form. Right Click over package – JFrame Form. Right class name and click Finish. (Figure 8)


Figure 8

We want to design a frame which is like Figure 9.

.
Figure 9

For this reason we add Tabbed Pane to frame and resize using arrow. We cover whole frame.
(Figure 10)

Figure 10

To add tab,select Panel and add to tabbed pane. Then resize again and cover the pane. (Figure 11)


Figure 11

Then right click over tab1 text to change tab name. For Examle first tab will be login tab. (Figure 12)


Figure 12

Now we add a Label to display message that shows which field will be used to enter username. Select label in palette and put int anywhere you want. Using little boxex you can resize easily. To change label name, double click and enter label script. (Figure 13)


Figure 13

Now we want to add text field. Select textfied from palette. Put it to panel. Right Click – Change variable name. Then give meaningfu variable name to use it easily while coding. Then again right click- edit text to delete jTextField1 text. Otherwise when application is run it will be displayed. (Figure 14)

Figure 14

Add password label and password field using requiered swings from palette. Then add button to click to login. Choose OK button from palette and again put it to panel. Change variable name and text. Then to give action double click on the button. Netbeans bring you tou source code of action of the button automatically.
Go on designing until reaching design like in Figure 9.

In this example we have login page to access the application. We have users whose responsibility is to add students, display, delete and update student information in mygediz system. So we need three tables. For one table users to hold username and password of all student affairs officers. For one table to hold students and the last one is to hold all phone numbers of students. Becuase each student may have one more than phone numbers. (Figure 15)

Figure 15

Design and Code Database Tables

Connect the database through SQLPlus or SQLDeveloper. Create all required tables with given properties.

Cretating Users Table

In users table our primary key will be username. Because it should be unique for each user. Instead of username, we may add new column as id to select as primary key and add  unique constraint to username. But we prefer not to add extra column. We use username as primary key.
create table users (username varchar(20),password varchar(20),primary key(username));
We should add users to the database.
insert into users values('esra','123456');
insert into users values('said','111222');

Creating Students Table

create table students(
id int,
name varchar(20) not null,
surname varchar(20) not null,
department varchar(20),
gpa number(3,2),
primary key(id)
);

Creating Phones Table

Students may have one or more phone numbers. So we hold Phones table which will have auto incremented id column, stuId column which refers students table and shows which phone number is belong to which student. So stuId is foreign key for phones table.
create table phones (
id int,
stuId int,
phone varchar(10) not null,
foreign key (stuId) references students,
primary key(id)
);
In Oracle to provide auto_increment we have to create sequence and trigger. In phones table we want to start id with 1 and increment it by 1.
CREATE SEQUENCE phone_seq  MINVALUE 1
 START WITH 1
 INCREMENT BY 1
 CACHE 20;

CREATE OR REPLACE TRIGGER phone_auto_increment
BEFORE INSERT ON phones
for each row
begin
select phone_seq.nextval into :new.id from dual;
end;
/

Creating Java Classes

For each table we have to create a java class that is used to map. After the other configurations are done, we can insert, delete, update any record as easily as creating java objects. We have three tables : Users, Students, Phones. So we create three Java classes.
User.java
Under datapack package, we create User.java class. In Uers table we have two columns whose names are userName and password respectively. So in java class we create two fields to be used mapping of these columns. We have to generate getter and setter methods. Because hibernate needs them. To generate getter and setter methods in netbeans automatically, right click over editor -> Insert code -> Getter and setter. (Figure 16)


Figure 16
package datapack;
public class User {
   
    private String userName;
    private String password;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password; 
    }
}
Student.java
Again under datapack package, we create Student.java class. Our student has id, name, surname, department, gpa information. So we use these columns’ name and write as attributes in this class. We can give different names but to facilitate our job, we use same names. In this scenario Students and Phones tables have one-to-many relation. It means one student may have zero or more phone numbers. Likewise a phone number can be just mapped to one student and many phone numbers can be mapped to one student. To be able to access phone numbers in student object we have to declare one-to-many relation in mapping file. To hold many phone numbers, we have to declare a java data structure. So we declare Set<Phone> phones attribute.
package datapack;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author esranur.galip
 */
/*We can use annotations of J(ava)P(ersistence)A(pi) to Show which attribute is mapped to which column of table */

@Entity
@Table(name = "STUDENTS")
public class Student {

    @Id
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "surname")
    private String surname;

    @Column(name = "gpa")
    private double gpa;

    @Column(name = "department")
    private String department;

    private Set<Phone> phones = new HashSet<Phone>();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public double getGpa() {
        return gpa;
    }

    public void setGpa(double gpa) {
        this.gpa = gpa;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public Set<Phone> getPhones() {
        return phones;
    }

    public void setPhones(Set<Phone> phones) {
        this.phones = phones;
    }

    public String toString() {
        String text = "Id\tName\tSurname\tDepartment\tGpa\tPhones\n";
        text += id + "\t" + name + "\t" + surname + "\t" + department + "\t" + gpa;
        for (Phone p : phones) {
            text += "\t" + p.getNumber();
        }
        text += "\n";

        return text;
    }
}
We write toString method to be able to use when a student’s information is displayed. We add all values to text variable by formatting tabs. Then we add phone information by traversing the phones list. Because of list object type is Phone, in for loop condition we can declare Phone p varible and assign phones list to the variable. So in each iteration p variable will have one phone value. In for loop we add phone number to text variable.
Phone.java
Phones table has id, stuId and phone columns. stuId is foreign key and refers to students table. As we said before we have one-to-many relation between students and phones tables. So to provide this mapping we added hashset of phones in student java class. In phone class we declare student referans as attribute to relate phone to student.
package datapack;
/**
 *
 * @author esranur.galip
 */
public class Phone {

    private int id;
    private Student student;
    private String number;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}

After creating all classes I want to add addPhone method to Student java class to facilitate to add phone information. Because before adding new phone number, we have to set student attribute of that phone after that we add that phone to student’s phone list.
public void addPhone(Phone phone) {
        phone.setStudent(this);
        phones.add(phone);
    }



After adding this method Student java class is this :
package datapack;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @author esranur.galip
 */
/*We can use annotations of J(ava)P(ersistence)A(pi) to Show which attribute is mapped to which column of table */
@Entity
@Table(name = "STUDENTS")
public class Student {

    @Id
    @Column(name = "id")
    private int id;
    @Column(name = "name")
    private String name;
    @Column(name = "surname")
    private String surname;
    @Column(name = "gpa")
    private double gpa;
    @Column(name = "department")
    private String department;
    private Set<Phone> phones = new HashSet<Phone>();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public double getGpa() {
        return gpa;
    }

    public void setGpa(double gpa) {
        this.gpa = gpa;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public Set<Phone> getPhones() {
        return phones;
    }

    public void addPhone(Phone phone) {
        phone.setStudent(this);
        phones.add(phone);
    }

    public void setPhones(Set<Phone> phones) {
        this.phones = phones;
    }

    public String toString() {
        String text = "Id\tName\tSurname\tDepartment\tGpa\tPhones\n";
        text += id + "\t" + name + "\t" + surname + "\t" + department + "\t" + gpa;
        for (Phone p : phones) {
            text += "\t" + p.getNumber();
        }
        text += "\n";

        return text;
    }
}

Implementation

Configuration of Hibernate Files

Hibernate.cfg.xml
To connect to the database and find the required mapping files we have to create hibernate configuration file. I prefer to collect all hibernate files under hibernatepacks. So first we create hibernatepacks package. Then to create the configration file, right click over package, select Hibernate Configuration Wizard. (Figure 17, 18, 19)

Figure 17

Figure 18

Figure 19

NetBeans automatically generates configuration file. But we need modification.  (Figure 20)

Figure 20

To modify the code we select the Source tab and we reach the source code. We change dialect as Oracle10gDialect. Then we add password information and to display each transaction’s sql code in the console we add Show_sql property. (Figure 21)

Figure 21
Users.hbm.xml
For each table in our database, we prefer to create a class and hibernate mapping file. Mapping file provides us to map each column to each attribute of class. To create new Hibernate mapping file, right click over desired package, select Hibernate Mapping Wizard. (Figure 22)


Figure 22
After giving name of file, we will select the table whose mapping file is being created. (Figure 23)


Figure 23

Then to select related class for mapping, click … button. Write class name into search field and find the related class, add the class. (Figure 24)


Figure 24

We will do mapping between hibernate-mapping tags. First we write class tag that declares which class mapping is being done. name keyword in class tag we give path of mapped class. Student java class is under datapack package. Then in table keyword we give mapped table name.  Between id tags we declare our primary key column of our table. For other columns and attributes we use property tag.  name  keyword in property tag specifies attribute name of class. name keyword in column tag specifies related column name.  (Figure 25)


Figure 25

After creating each hbm.xml file we have to add it to hibernate configure file. Hibernate Mapping Wizard does this operation as soon as cerating mapping file. If you don’t use Hibernate framework, you should do it manually. (Figure 26)


Figure 26
Students.hbm.xml
Here we have different tag set. This set tag is used to map phones hash set in Student java class. As doing this we specify that in Phones table find all tuples whose stuId column is equal to id of this student. So name keyword in set tag specifies hash set name in Student table. Table keyword is declaring table name that holds student’s phone number(s). Then with one-to-many tag we declare class name of phones table.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="datapack.Student" table="STUDENTS">
        <id name="id" type="int">
            <column name="id"/>
        </id>
        <property name="name" type="java.lang.String">
            <column length="20" name="name" not-null="true"/>
        </property>
        <property name="surname" type="java.lang.String">
            <column length="20" name="surname" not-null="true"/>
        </property>  
        <property name="department" type="java.lang.String">
            <column length="20" name="department" not-null="false"/>
        </property> 
        <property name="gpa" type="java.lang.Double">
            <column  name="gpa" precision="2" not-null="false"/>
        </property> 
        <set name="phones" table="phones" cascade="all" inverse="true" >
            <key>
                <column name="stuId" not-null="true" />
            </key>
            <one-to-many class="datapack.Phone" />
        </set>
    </class>
</hibernate-mapping>
Phones.hbm.xml
In phones table we created trigger to increment id automatically. Here we declare this using generator keyword. To map student attribute whose type is Student java class we use many-to-one tag. name keyword in the tag declare student attribute of Phone java class. class keyword is path of Student java class.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="datapack.Phone" table="PHONES">
        <id name="id" type="int">
            <column name="id" />
             <generator class="increment"/>
        </id>
        <many-to-one name="student" class="datapack.Student" cascade="all">               <column name="stuId" not-null="true" />
        </many-to-one>
        <property name="number" type="java.lang.String">
            <column  length="10" name="phone" unique="true" not-null="true"/>
        </property>  
     
  </class>
</hibernate-mapping>
Last status of hibrerbate.cfg.xml


Figure 27

HibenateUtility.java

After writing configuration and mapping files, to run code we have to create session to connect to the database. So we first get instance of Sessionfactory by configuring hibernate.cfg.xml file. This operation is done just one time. Because SessionFactory is heavyweight. Using session factory we openSession. For each database we have to create new session. For each transanction we have to begin transaction. Note that commit the transaction and at the end of the application don’t forget to close session. For this creating ang getting instance operations we prefer to create HibenateUtility class under datapack package.
package datapack;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
/**
 *
 * @author esranur.galip
 */
public class HibernateUtility {

    private SessionFactory sessionFactory;
    private Session session;
    private Transaction tx;

    public void configureSession() {
        sessionFactory = (SessionFactory) new Configuration().configure("/hibernatepacks/hibernate.cfg.xml").buildSessionFactory();
    }

    public Session openSession() {
        session = sessionFactory.openSession();
        return session;
    }

    public Transaction beginTransaction() {
        tx = session.beginTransaction();
        return tx;
    }
}

GUI.java

Here we have a part of GUI java class code. Here we create an object of HibernateUtility class and we call configureSession() method of it in constructor. Then we disabled all tabbes except Login tab. Because if user can login successfully, then we want to display contents of other tabs.
package mygediz;

import datapack.HibernateUtility;
import datapack.Phone;
import datapack.Student;
import datapack.User;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class Gui extends javax.swing.JFrame {

    private HibernateUtility utility;

    public Gui() {
        initComponents();
        utility = new HibernateUtility();
        utility.configureSession();

        jTabbedPane1.setEnabledAt(1, false);
        jTabbedPane1.setEnabledAt(2, false);
        jTabbedPane1.setEnabledAt(3, false);
        jTabbedPane1.setEnabledAt(4, false);
    }

/* GUI components’ construction methods here… */

    private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        User user;
/*Open session and beginTransaction using utility’s methods */
        Session session = utility.openSession();
        Transaction tx = utility.beginTransaction();

/*Check whether user entered userName and password or not, if entered, using session object’s get method we can find any record from table as object giving it’s id as parameter.*/
        if (!userName.getText().equals("") && !password.getText().equals("")) {
            user = (User) session.get(User.class, userName.getText());
            tx.commit();
/*if user is null, it means we have no record about user whose userName is equal to userName that was entered by user */
            if (user == null) {
                loginMessage.setText("Invalid userName");
            }
/*If user is not null, it means we have an user whose userName is equal to userName that was entered by user, we check the password whether user object’s password is equal to password that was entered by user or not. As said before using get method of session we get all record values from table to user object. If it is not equal we display Invalid password message */
else if (!user.getPassword().equals(password.getText())) {
                loginMessage.setText("Invalid password");
            }
/* If it equals, we display success message and enable all tabs. */
else {
                loginMessage.setText("Success");
                jTabbedPane1.setEnabledAt(1, true);
                jTabbedPane1.setEnabledAt(2, true);
                jTabbedPane1.setEnabledAt(3, true);
                jTabbedPane1.setEnabledAt(4, true);
            }
        }
/* If user didn’t enter a value or directly click to login button, we display “Enter password” message */
else {
            loginMessage.setText("Please enter userName/password");
        }
        session.close();
    }                                          

    private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
   /*Open session and beginTransaction using utility’s methods */

        Session session = utility.openSession();
        Transaction tx = utility.beginTransaction();
/*We want to add new student. Values are entered y user using gui components. So first we create a student object. Then we set all values according to user entered values. */
        Student newStudent = new Student();
        newStudent.setId(Integer.parseInt(id.getText()));
        newStudent.setName(name.getText());
        newStudent.setSurname(surname.getText());
        newStudent.setDepartment(department.getText());
        newStudent.setGpa(Double.parseDouble(gpa.getText()));

/* We just use save method of session object*/
        session.save(newStudent);
/*Don’t forget to call commit methdo of transaction */
        tx.commit();
        session.close();
        addMessage.setText("Success");

    }

/* This method is written to find student record giving it’s id */                                        
    public Student getStudent(Session session, int id) {
        Student student = (Student) session.get(Student.class, id);

        return student;
    }

    private void updateButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
        /*Open session and beginTransaction using utility’s methods */
        Session session = utility.openSession();
        Transaction tx = utility.beginTransaction();

/* find user using previously written getStudent method*/
        Student updatedStudent = getStudent(session, Integer.parseInt(updateId.getText()));

        if (updatedStudent == null) {
            updateMessage.setText("Wrong id");
        } else {
/*If we have that student we can add new phone.*/
            Phone newPhone = new Phone();
            newPhone.setNumber(updatePhone.getText());
            updatedStudent.addPhone(newPhone);
/*Just call saveOrUpdate or just update method of session */
            session.saveOrUpdate(updatedStudent);
/*Don’t forget to call commit method of transaction */
            tx.commit();
            updateMessage.setText("Success");
        }
        session.close();
    }                                           

    private void displayButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
/*Open session using utility’s method */
        Session session = utility.openSession();
/* Find student */
        Student displayedStudent = getStudent(session, Integer.parseInt(displayId.getText()));

        if (displayedStudent == null) {
            displayArea.setText("Wrong id");
        } else {
/*Just paste information of student to displayArea */
            displayArea.setText(displayedStudent.toString());
          }
        session.close();

    }                                            

    private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
        /*Open session and beginTransaction using utility’s methods */
        Session session = utility.openSession();
        Transaction tx = utility.beginTransaction();
        Student deletedStudent = getStudent(session, Integer.parseInt(deleteId.getText()));
        if (deletedStudent == null) {
            deleteMessage.setText("Wrong id");
        } else {
/* call delete method of session */
            session.delete(deletedStudent);
            tx.commit();
            deleteMessage.setText("Success");
        }
        session.close();
    } 

/* Main class and attributes here */                                        
}

Easy Way

Instead of creating mapping file for each table, we can create just one mapping file.  Between hibernate-mapping tags, for each class we write class tag. Mappings are done between class tags for each table. In hibernate.cfg.xml, insetead of writing 3 mapping files, we just write one mapping file. Because this file contains all mappings.
Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
        <property name="hibernate.connection.username">esra</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="show_sql">true</property>   
        <mapping resource="hibernatepacks/mappings.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
Mappings.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="datapack.User" table="USERS">
        <id name="userName" type="java.lang.String">
            <column name="userName" length="20"/>
        </id>
        <property name="password" type="java.lang.String">
            <column length="20" name="password" not-null="true"/>
        </property> 
 
    </class>
    <class name="datapack.Student" table="STUDENTS">
        <id name="id" type="int">
            <column name="id"/>
        </id>
        <property name="name" type="java.lang.String">
            <column length="20" name="name" not-null="true"/>
        </property>
        <property name="surname" type="java.lang.String">
            <column length="20" name="surname" not-null="true"/>
        </property>  
        <property name="department" type="java.lang.String">
            <column length="20" name="department" not-null="false"/>
        </property> 
        <property name="gpa" type="java.lang.Double">
            <column  name="gpa" precision="2" not-null="false"/>
        </property> 
        <set name="phones" table="phones" cascade="all" inverse="true" >
            <key>
                <column name="stuId" not-null="true" />
            </key>
            <one-to-many class="datapack.Phone" />
        </set>
    </class>
    <class name="datapack.Phone" table="PHONES">
        <id name="id" type="int">
            <column name="id" />
            <generator class="increment"/>
        </id>
        <many-to-one name="

student" class="datapack.Student" cascade="all">
            <column name="stuId" not-null="true" />
        </many-to-one>
        <property name="number" type="java.lang.String">
            <column  length="10" name="phone" unique="true" not-null="true"/>
        </property>  
    </class>
</hibernate-mapping>

REFERENCES

[1] : “Hibernate (Java)”, http://en.wikipedia.org/wiki/Hibernate_(Java)

[4] : “Hibernate Community Documentation”, http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch01.html