Tuesday, September 14, 2010

Using Hibernate, Spring, Maven, oracle all together

This tutorial will give an overview how can you wire up spring and hibernate together. The spring framework comes with ability to inject dependencies through the spring configuration file, we can leverage that to create the hibernate SessionFactory. Some code samples are given below. Also, we'll use the java persistence api so that we don't need to specify the hibernate mapping files.

The User class :


Entity
@Table(name="My_USER")
public class User {

private Long id;
private String name;
private String password;


@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "user_id_seq")
@SequenceGenerator(name="user_id_seq", sequenceName = "MY_USER_SEQ")
@Column(name="USER_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}

@Column(name="USER_NAME")
public String getName() {
return name;
}
}
Replace the GeneratedValue annotation with strategy=GenerationType.AUTO if you are using any other database and no need to have sequencegenerator.

The DAO interface and implementation :




public interface UserDAO {

public void saveUser(User user) ;
public List<User> listUser() ;
}

public class UserDAOImpl implements UserDAO {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public void saveUser(User user) {
hibernateTemplate.saveOrUpdate(user);
}

@SuppressWarnings("unchecked")
public List<User> listUser() {
return hibernateTemplate.find("from User");
}

}
The main application class:




public class App
{
public static void main( String[] args )
{


BeanFactory factory = new XmlBeanFactory(
new ClassPathResource("application-context.xml"));

UserDAO dao = factory.getBean("myUserDAO");

User user=new User();
user.setName("ABc");
user.setPassword("password");


dao.saveUser(user);
....
Spring configuration file : application-context.xml




<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:user/password@localhost:1521:XE"/>
</bean>

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>ca.co.fusionapp.domain.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect"> org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<bean id="myUserDAO" class="ca.co.fusionapp.dao.UserDAOImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>
The above configuration uses setter dependency injection (i.e, the UserDAO has a setSessionFactory method, which sets up the hibernate session factory).

Download the entire code from here, which contains the pom.xml and run the above example using following command : mvn clean compile exec:java -e

I've oracle express installed and set up a username/password which needs to be updated in application-context.xml file.

Tuesday, August 31, 2010

Introduction to JSF

Java Server Faces is View in MVC (Model, View, Controller).

Get started with JSF

1. Download jsf latest jar files (https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=10411)
2. Set up the
3. Set up your project by modifying web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

4. Write the jsp files, java source code, faces-config.xml and deploy on a webserver
For e.g converter.jsp
<f:view>

<h:form>
<h:panelGrid border="1" columns="2">
<f:facet name="header">
<h:outputText value="Temperature Conversion"></h:outputText>
</f:facet>

<f:facet name="footer">
<h:commandButton value="Convert" action="#{conversion.convert}"></h:commandButton>


</f:facet>

<h:outputText value="Celcius"></h:outputText>
<h:inputText value="#{conversion.celcius}"><f:convertNumber type="number" maxFractionDigits="2"/></h:inputText>

<h:outputText value="Fahrenheit "></h:outputText>
<h:inputText value="#{conversion.fahrenheit}"><f:convertNumber type="number" maxFractionDigits="2"/></h:inputText>

</h:panelGrid>
</h:form>

</f:view>

the conversion data bean class:

package proj;

public class Conversion {
..

public Float getCelcius()
{
return celcius;
}

public void setCelcius(Float c)
{
System.out.println("Celcius="+c);
celcius=c;
}
public Float getFahrenheit()
{
return fahrenheit;
}

public void setFahrenheit(Float f)
{
System.out.println("Fahrenheit="+f);
fahrenheit=f;
}

public String convert()
{
//conversion logic
return "convert";
}

..
}
faces-config.xml
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>
conversion</managed-bean-name>
<managed-bean-class>
proj.Conversion</managed-bean-class>
<managed-bean-scope>
session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/converter.jsp</from-view-id>
<navigation-case>
<from-outcome>convert</from-outcome>
<to-view-id>/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>

</faces-config>

Download the full source code

Wednesday, May 12, 2010

UML Integration

There are several tools available which can generate class diagrams, but I found this one very useful, which can generate class diagrams when you build your java project using ant.

Download the UmlGraph from http://www.umlgraph.org/

and also download the Graphviz from http://www.graphviz.org/

Modify your build.xml and add following javadoc


<target name="javadocuml" depends="init, init-compile-classpath" description="generates javadoc and also UML Diagram">
<mkdir dir="${DIST_DIR}/report/javadoc">
   <javadoc sourcepath="${SRC_DIR}" packagenames="test.*" destdir="${DIST_DIR}/report/javadoc" classpathref="compile.classpath" private="true">
     <doclet name="org.umlgraph.doclet.UmlGraphDoc" path="${LIB_DIR}/UMLGraph-5.2.jar">
        <param name="-inferrel"/>
           <param name="-inferdep"/>
           <param name="-hide" value="java.*"/>
          <param name="-collpackages" value="java.util.*"/>
           <param name="-qualify"/>
           <param name="-postfixpackage"/>
           <param name="-nodefontsize" value="9"/>
           <param name="-nodefontpackagesize" value="7"/>
           <param name="-link" value="http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec"/>
           <param name="-link" value="http://java.sun.com/j2se/1.5/docs/api"/>
       </doclet>
   </javadoc>
<apply executable="dot" dest="${DIST_DIR}/report" parallel="false">
    <arg value="-Tpng">
  <arg value="-o">
   <targetfile>
   <srcfile>
   <fileset dir="${DIST_DIR}/report" includes="*.dot">
   <mapper type="glob" from="*.dot" to="*.png">
   </mapper></fileset>
   </srcfile>
   </targetfile>
  </arg>
 </arg>
</apply>
</mkdir>
</target>


Run your build.xml with javadocuml ant-task and look for report dir. You can see some class diagrams in your javadoc. Refer to the umlgraph website for more information about things you can do with the class diagrams.


Maven configuration




<dependency>
   <groupId>gr.spinellis</groupId>
   <artifactId>UmlGraph</artifactId>
   <version>5.2</version>
</dependency>   


<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <version>2.7</version>
  <configuration>
  <doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>

  <!-- <docletPath>/path/to/UmlGraph.jar</docletPath> -->
  <docletArtifact>
      <groupId>org.umlgraph</groupId>
      <artifactId>doclet</artifactId>
      <version>5.1</version>
  </docletArtifact>
  <additionalparam>-inferrel -inferdep -quiet -hide java.*
 -collpackages java.util.* -qualify
 -postfixpackage -nodefontsize 9
 -nodefontpackagesize 7 -outputencoding utf8
  </additionalparam>
  <useStandardDocletOptions>true</useStandardDocletOptions>
  </configuration>
</plugin>

Tuesday, April 27, 2010

Oracle Tips and tricks

SELECT query has limitations when you have more then 1000 fields to compare in the list.
One alternative is to use SQL Loader as follows :
1. Create a file called /tmp/test.dat :
100001
100002
100003
100004
100005
100006

2. create table temp
(number varchar2(10));

or truncate table temp

3. Create a file test.ctl in /tmp dir with following contents
LOAD DATA
INFILE test.dat
INTO TABLE temp
(number position(1:6) CHAR)

run command from the unix box where oracle client is installed from the /tmp dir:
sqlldr username/password@serviceid/sid control=test.ctl

Now, you can use the temp table in your query as follows :
For IN clause:
Select * from table_a a, temp t
where a.number = t.number;
for NOT IN clause:
Select * from table_a a, temp t
where a.number = t.number(+) and t.number is null;