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