This tutorial is for beginners who want to learn steps to create EJB persistence application with Eclipse and Jboss.
Tools used
Eclipse (Galileo)
Jboss-5.1.0.GA
MySQL database
First of all I'll create a database called studentmgt_db. You can use MySQL GUI tool like MySQL Query Browser or MySQL Work Bench to create a database.
Then I'm going to create a datasource. Go to your jboss directory ..jboss-5.1.0.GA\docs\examples\jca inside that folder there is file called mysql-ds.xml. I copied that file to ...jboss-5.1.0.GA\server\default\deploy. Then you can add your database details to that file.
mysql-ds.xml
Now create EJB project.
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- $Id: mysql-ds.xml 41017 2006-02-07 14:26:14Z acoliver $ -->
- <!-- Datasource config for MySQL using 3.0.9 available from:
- http://www.mysql.com/downloads/api-jdbc-stable.html
- -->
- <datasources>
- <local-tx-datasource>
- <jndi-name>StudentMgtDS</jndi-name>
- <connection-url>jdbc:mysql://localhost:3306/studentmgt_db</connection-url>
- <driver-class>com.mysql.jdbc.Driver</driver-class>
- <user-name>root</user-name>
- <password>123</password>
- <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
- <!-- should only be used on drivers after 3.22.1 with "ping" support
- <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
- -->
- <!-- sql to call when connection is created
- <new-connection-sql>some arbitrary sql</new-connection-sql>
- -->
- <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
- <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
- -->
- <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
- <metadata>
- <type-mapping>mySQL</type-mapping>
- </metadata>
- </local-tx-datasource>
- </datasources>
Create a new EJB project called StudentManagementEJB. I use JBoss server as application server.
Create a xml file called persistence.xml in META-INF directory.
persistence.xml
Then we have to create an Entity class. Right click on the project -> New -> Class
- <?xml version="1.0" encoding="UTF-8"?>
- <persistence version="2.0"
- xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
- <persistence-unit name="StudentMgtPU"
- transaction-type="JTA">
- <jta-data-source>java:/StudentMgtDS</jta-data-source>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
- <property name="hibernate.hbm2ddl.auto" value="create" />
- </properties>
- </persistence-unit>
- </persistence>
- Entity Class must have @Entity annotaion
- Must have a public or protected no-arg constructor
- If it passed as a detached object through a remote interface, Must implement Serializable
- Must have an id annotated with @Id
Student.java
Create session beans.
- package com.sameera.domain;
- import java.io.Serializable;
- import javax.persistence.*;
- @Entity
- @Table(name = "student")
- public class Student implements Serializable {
- private static final long serialVersionUID = 1L;
- @Id
- @GeneratedValue
- @Column(name = "id")
- private Integer id;
- @Column(name = "first_name", length = 100)
- private String firstName;
- @Column(name = "last_name", length = 100)
- private String lastName;
- @Column(name = "email", length = 100)
- private String email;
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public String getFirstName() {
- return firstName;
- }
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getLastName() {
- return lastName;
- }
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
- }
I create a Stateless session bean with Local interface.
I added business methods and added add student code.
ManageStudentSessionBeanLocal.java
- package com.sameera.session;
- import javax.ejb.Local;
- import com.sameera.domain.Student;
- /**
- *
- * @author Sameera Jayasekara
- *
- */
- @Local
- public interface ManageStudentSessionBeanLocal {
- public boolean addStudent(Student Student);
- }
ManageStudentSessionBean.java
Run EJB application on Jboss server.
- package com.sameera.session;
- import javax.ejb.Stateless;
- import javax.persistence.EntityManager;
- import javax.persistence.PersistenceContext;
- import com.sameera.domain.Student;
- /**
- * Session Bean implementation class ManageStudentSessionBean
- *
- * @author Sameera Jayasekara
- */
- @Stateless
- public class ManageStudentSessionBean implements ManageStudentSessionBeanLocal {
- @PersistenceContext
- private EntityManager entityManager;
- @Override
- public boolean addStudent(Student student) {
- entityManager.persist(student);
- return true;
- }
- }
See the server console JNDI bindings.
Now see the database. Student table is created.
Now start working on web application.
File -> New -> Dynamic Web Project
Go next Select 'Generate web.xml deployment descriptor' and finish.
Right click on web content and create a new jsp called index.jsp.
index.jsp
- <%@page contentType="text/html" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>EJB3 JPA Jboss - codesstore.blogspot.com</title>
- </head>
- <body>
- <form action="ManageStudentServlet" method="POST">
- <table border="0" width="100%">
- <tr>
- <td colspan="3"> ${message}</td>
- </tr>
- <tr>
- <td>First Name</td>
- <td>:</td>
- <td><input type="text" name="fname" value="" /></td>
- </tr>
- <tr>
- <td>Last Name</td>
- <td>:</td>
- <td><input type="text" name="lname" value="" /></td>
- </tr>
- <tr>
- <td>Email</td>
- <td>:</td>
- <td><input type="text" name="email" value="" /></td>
- </tr>
- <tr>
- <td></td>
- <td></td>
- <td><input type="submit" value="Add" name="Add" /></td>
- </tr>
- </table>
- </form>
- </body>
- </html>
Create a servlet to handle the request.
File -> New -> Servlet
Before calling Enterprise beans we have to add the ejb project to build path.
Go to projects tab and add StudentManagementEJB project.
ManageStudentServlet.java
I looked up ManageStudentSessionBean/local. You can see server console to find JNDI bindings(see image given above)
- package com.sameera.controller;
- import java.io.IOException;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.naming.NamingException;
- import javax.servlet.RequestDispatcher;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.sameera.domain.Student;
- import com.sameera.session.ManageStudentSessionBeanLocal;
- /**
- *
- * @author Sameera Jayasekara
- *
- */
- public class ManageStudentServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- private ManageStudentSessionBeanLocal manageStudentSessionBeanLocal;
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- try {
- Context context = new InitialContext();
- manageStudentSessionBeanLocal = (ManageStudentSessionBeanLocal) context
- .lookup("ManageStudentSessionBean/local");
- } catch (NamingException e) {
- e.printStackTrace();
- }
- }
- protected void doGet(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- }
- protected void doPost(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- String message = "";
- String firstName = request.getParameter("fname");
- String lastName = request.getParameter("lname");
- String email = request.getParameter("email");
- Student student = new Student();
- student.setFirstName(firstName);
- student.setLastName(lastName);
- student.setEmail(email);
- if (manageStudentSessionBeanLocal.addStudent(student)) {
- message = "Student Successfuly Added";
- } else {
- message = "Student Adding Failed";
- }
- request.setAttribute("message", message);
- RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
- rd.forward(request, response);
- }
- }
You can use @EJB annotaions to dependancy injection in a servlet but I tried it with JBoss that didn't work.Then I used @EJB(mappedName="Test"), @EJB with mappedName attribute( @Stateless(mappedName="Test") also used).Then it worked with remote interface. But I prefer JNDI lookup.
web.xml configuration file looks like this.
web.xml
Now You can run the web application.
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
- <display-name>StudentManagementWeb</display-name>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <description></description>
- <display-name>ManageStudentServlet</display-name>
- <servlet-name>ManageStudentServlet</servlet-name>
- <servlet-class>com.sameera.controller.ManageStudentServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ManageStudentServlet</servlet-name>
- <url-pattern>/ManageStudentServlet</url-pattern>
- </servlet-mapping>
- </web-app>
Check the database data will be added.
Project structure in Eclipse
Note : I put mysql-connector-java-5.1.5-bin.jar to ...jboss-5.1.0.GA\server\default\lib
Hi Sameera,
ReplyDeleteThanks for the post . I am using GlassFish with JPA + Eclipse. Would you please make a tutorial on this.
Thanks
David
PS: are you available on Skype?
Simple CRUD with JSF and Hibernate - GeekOnJava:
DeleteHibernate CRUD example using HQL query language:
Solve QuerySyntaxException in Hibetnate:
All are superb articles... Thanks a lot
ReplyDeleteHi Sameera, good example, now we can use netbeans and generate all these codings.....
ReplyDeleteYea. See My EJB JPA Netbeans tutorial http://codesstore.blogspot.com/2012/07/ejb3-and-jpa-step-by-step-tutorial_05.html
DeleteHi Sameera,
ReplyDeleteIm a new comer to the JavaBeans.
I got the following error when starting the JBoss server. What should I do?
12:12:13,843 ERROR [SchemaExport] schema export unsuccessful
Hi Sapumal. U got the answer? :D
Deletegreat work
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteThanks Sameera...it helped me alot...while learning JPA...
ReplyDeletemachan sammeera i tried it form Postgres Sql , but not creating tables ,what is the jdbc connector for Postgres
ReplyDeletethanks ,im also from UCSC. Good luck
I haven't tried with Postgres,
DeleteCheck this value is 'create'
property name="hibernate.hbm2ddl.auto" value="create"
Driver may be
postgresql-.....jdbc4.jar
Driver class: org.postgresql.Driver
Connection URL:
jdbc:postgresql://[servername]:[port]/[database name]
thanks it is working...
DeleteGreat work, I have a problem with the steps, I'm using Jboss as 7.1, and the directorys jboss-as-7.1/docs/examples/jca and jboss-7.1server/default/deploy don't exist in this version, the file mysql-ds.xml is standalone.xml in this version; how can I do the step of the jboss when you copy the file, where should I copy it?
ReplyDeleteThanks for the tutorial, it's excellent
Great work! Simple and Nice Article.
ReplyDeleteThis is good stuff Sameera. well presented and easy to understand !
ReplyDeleteHTTP method POST is not supported by this URL
ReplyDeleteplease help me
Delete