Sunday, June 12, 2011

Hibernate and Java command-line compilation, the understanding

1. Prepare a directory(java package) that won't have a collision with other package name, ideally this is your reverse domain name. Mine is http://anicehumble.com. So the package goes to com/anicehumble directory.
$ mkdir -p source/com/anicehumble

2. Create a directory for your compiled class
$ mkdir class

3. Create a directory for libraries you are using, this is where you will put jar(java archive) files, e.g. Hibernate
$ mkdir lib



4. Then fire up your favorite text editor, mine is vi ;-)
$ vim source/com/anicehumble/TryHib.java

5. Then type this:
package com.anicehumble;

public class TryHib {
        public static void main(String[] args) {
                System.out.println("Hello World");
        }
}

6. Then compile:
$ javac -d class source/com/anicehumble/TryHib.java

The -d class is a directive for javac compiler to put your compiled class(es) to class directory, the compiled class(es) will be put on the directory based on the name you specified on the topmost line of your java code, which is package com.anicehumble;; with this, your .class file(s) will be put in class/com/anicehumble. Make it a habit to use -d yourdirectoryhere so your source code and compiled code is more organized. If you don't specify -d directive, the compiled code will also be put in the same directory as your source code.

7. To run:
java -classpath class com.anicehumble.TryHib

Note that we specify classpath, if we don't specify -classpath class, we have to do two steps:
cd class
java com.anicehumble.TryHib

Please do note that we need to use dots instead of forward-slashes(or back-slash when using Windows) when running Java programs.

8. Let's create a model

Create a directory for model
$ mkdir source/com/anicehumble/model

Create a Person.java class under your model directory
$ vi source/com/anicehumble/model/Person.java 

Type this in your text editor:

package com.anicehumble.model;

public class Person {

        private int personId;
        private String personName;
        private int age;


        public int getPersonId()  {
                return personId;
        }
        public void setPersonId(int value) {
                personId = value;
        }

        public String getPersonName() {
                return personName;
        }
        public void setPersonName(String value) {
                personName = value;
        }

        public int getAge() {
                return age;
        }
        public void setAge(int value) {
                age = value;
        }

}

Compile
$ javac -d class source/com/anicehumble/model/Person.java 

To check the compiled code
ls class/com/anicehumble/model/Person.class

9. Access the Person class from TryHib.java

package com.anicehumble;

import com.anicehumble.model.*;

public class TryHib {
        public static void main(String[] args) {
                // com.anicehumble.model.Person p = new com.anicehumble.model.Person();
                Person p = new Person();
                p.setPersonName("Michael");
                System.out.println("Hello " + p.getPersonName());
        }
}

Compile:
$ javac -d class -classpath class source/com/anicehumble/TryHib.java

Then run:
$ java -classpath class com.anicehumble.TryHib

Output:
Hello Michael

10. Map the Person class to Hibernate, download this first:

Download the following files and put them on your lib directory
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate3.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
postgresql-9.0-801.jdbc4.jar
slf4j-api-1.6.1.jar
slf4j-simple-1.6.1.jar

11. Create a hibernate configuration under class/com/anicehumble

$ vi class/com/anicehumble/hibernate.cfg.xml

Type this, or better yet paste it:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.url">jdbc:postgresql://127.0.0.1/testdb</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.username">postgres</property>
        <property name="hibernate.connection.password">opensesame</property>
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.use_outer_join">true</property>

        <mapping resource="com/anicehumble/model/person.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

12. Map the class to table, use this xml mapping:

Create person.hbm.xml mapping with your favorite editor:
$ vi class/com/anicehumble/model/person.hbm.xml

<?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 name="com.anicehumble.model.Person" table="person">
                <id name="PersonId" column="personid">
                <generator class="sequence">
                        <param name="sequence">person_personid_seq</param>
                </generator>
                </id>

                <property name="PersonName" column="personname"/>
                <property name="Age" column="age"/>
        </class>

</hibernate-mapping>


13. Use the Person class and map it to database:

Launch your favorite editor
$ vi source/com/anicehumble/TryHib.java 

Type this:
package com.anicehumble;

import com.anicehumble.model.*;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;



public class TryHib {
        public static void main(String[] args) {
                System.out.println("Hello");

                SessionFactory sf = new Configuration().configure("/com/anicehumble/hibernate.cfg.xml").buildSessionFactory();


                Session sess = sf.openSession();
                Person p = (Person) sess.get(Person.class, 1);

                int result = p.getAge();

                System.out.println(Integer.toString(result));

                System.out.println("Test");
        }
}

Compile(substitute colon with semicolon when you are on Windows):
$ javac -classpath class:lib/hibernate3.jar -d class source/com/anicehumble/TryHib.java 

14. Run(substitute colon with semicolon when you are on Windows):
$ java -classpath class:lib/commons-collections-3.1.jar:lib/dom4j-1.6.1.jar:lib/hibernate-jpa-2.0-api-1.0.0.Final.jar:lib/hibernate3.jar:lib/javassist-3.12.0.GA.jar:lib/jta-1.1.jar:lib/postgresql-9.0-801.jdbc4.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-simple-1.6.1.jar com.anicehumble.TryHib

Output:
Hello
35
Test

15. I forgot, before you do step 14, here's the Postgres DDL for your model/object:

CREATE TABLE person
(
  personid serial NOT NULL primary key,
  personname varchar(1000) NOT NULL unique,
  age integer NOT NULL,
);
insert into person(personname, age) values('michael', 35);

Wednesday, June 8, 2011

Java Jar in 11 easy-to-follow steps

$ mkdir -p FirstProject/source/com/anicehumble
$ cd FirstProject/source/
$ vim com/anicehumble/Person.java

Then enter this:
package com.anicehumble;

public class Person {
        public static void main(String[] args) {
                System.out.println("Hello World");
        }
}

$ mkdir ../classes
$ javac -d ../classes com/anicehumble/Person.java 

The javac -d will build your Person.java in a mirror path(package) of your source code's path. So if you put your source code under the path of com/anicehumble, the -d ../classes parameter tells the compiler to put your compiled code in com/anicehumble path too, and under the classes path.

$ cd ../classes/

To test if your program is running properly(note, should use dots, not forward-slash, nor back-slash):
$ java com.anicehumble.Person

To put your class file in a JAR, create a manifest file first, indicating which class should the java runtime will look for main method:

$ echo "Main-Class: com.anicehumble.Person" > manifest.txt

Then put the classes in the jar, along with the manifest file:
$ jar -cvmf manifest.txt FTW.jar com/anicehumble/Person.class

Alternatively, you can do this, jar recursively get all the files if you just specify directory:
$ jar -cvmf manifest.txt FTW.jar com

To run:
$ java -jar FTW.jar

To make sure that your jar file is indeed self-contained:
$ mv FTW.jar ~/Desktop/
$ cd ../..
mv FirstProject x_Project 

The last step(mv, Unix's rename) above is to make sure that there's no false positive ;-)
$ cd ~/Desktop/

To run:
java -jar FTW.jar

Monday, June 6, 2011

Hello World

Michael-Buens-MacBook:src Michael$ mkdir -p a/nice/humble

Note above, if you are in Windows, create each directory(i.e. a, nice, humble) one by one.

Then create the file:

Michael-Buens-MacBook:src Michael$ vim a/nice/humble/Person.java

If you are in Windows, use Notepad++, it's an awesome editor.

Then type this:
package a.nice.humble;

public class Person {

        public static void main(String[] args) {
                System.out.println("Hello World!");
        }
}

Then type this in commandline:
Michael-Buens-MacBook:src Michael$ javac a/nice/humble/Person.java

Then type this in commandline to run your first program:
Michael-Buens-MacBook:src Michael$ java a.nice.humble.Person

Note, need to use dots, not forward-slash nor backward-slash

Output:
Hello World!

Saturday, June 4, 2011

Java

package buen.michael;

public class HelloWorld {
   public static void main(String[] args) {
       System.out.println("Hello World. Test Syntax Highlighter");
   }
}

Thursday, June 2, 2011

Hibernate Troubleshooting

If you have the following errors, just drag the jar file to your lib folder

java.lang.NoClassDefFoundError: org/dom4j/DocumentException
copy this to your lib: dom4j-1.6.1.jar

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
copy this to your lib: slf4j-api-1.6.1.jar

java.lang.NoClassDefFoundError: javax/persistence/EntityListeners
copy this to your lib: hibernate-jpa-2.0-api-1.0.0.Final.jar

org.hibernate.HibernateException: JDBC Driver class not found: org.postgresql.Driver
copy this to your lib: postgresql-9.0-801.jdbc4.jar
download the latest Postgresql jdbc jar file from postgresql.org


java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap
copy this to your lib: commons-collections-3.1.jar

org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
copy this to your lib: javassist-3.12.0.GA.jar

java.lang.NoClassDefFoundError: javax/transaction/Synchronization
copy this to your lib: jta-1.1.jar