Search code examples
javaoraclehibernateweblogicjndi

How to solve following ServiceException in Hibernate + Weblogic (JNDI) application?


I have a JNDI created on my Weblogic Server 12c. I am trying to connect to the Oracle database on the server using datasource and create a table there using hibernate. But I keep getting same exception org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Part 1 Part 2. This exception comes after I submit id and name from index.jsp Please see my java code and suggest any changes:

Versions: Java 8 Weblogic 12c Hibernate 5 Oracle 11g

Project Structure

Jar Files

Hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.datasource">java:comp/env/jdbc/Abc</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <mapping class="packone.Bean"/>
    </session-factory>
</hibernate-configuration>

Context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="jdbc/Abc"
        auth="container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@//RAPC01-1702-26:1521/P1130PL2"
        username="root"
        password="root"

        maxActive="100"
        maxIdle="20"
        minIdle="5"
        maxWait="10000">
    </Resource>
</Context>

HibernateUtil.java:

private static StandardServiceRegistry standardServiceRegistry;
private static SessionFactory sessionFactory;

public Session getSession(List<String> list) {
    list.add("START: getsession");
    if(sessionFactory == null) {
        try {
            standardServiceRegistry = new StandardServiceRegistryBuilder().configure().build();
            MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
            Metadata metadata = metadataSources.getMetadataBuilder().build();
            sessionFactory = metadata.getSessionFactoryBuilder().build();
        } catch(Exception e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            list.add(sw.toString());
        }
    }
    list.add("END: getsession");
    return sessionFactory.openSession();
}

web.xml: Just containts welcome file list as index.jsp

index.jsp:

<%
List<String> list = (List<String>)request.getAttribute("lsit");
if(list==null) {

} else {
    for(String str: list) {
        %> <%=str %><br> <%
    }
}
%>
<form action="BeanServlet">
<input type="text" name="id" placeholder="Enter Id...">
<input type="text" name="name"  placeholder="Enter Name...">
<input type="submit">
</form>

Bean.java:

package packone;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Bean {

    @Id
    private int id;
    private String name;

    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;
    }
}

BeanServlet.java:

List<String> list = new ArrayList<>();
        list.add("servlet started");
        int id = Integer.parseInt(request.getParameter("id"));
        String name = request.getParameter("name");

        list.add("id value: "+id);
        list.add("name value: "+name);

        Bean B = new Bean();
        B.setId(id);
        B.setName(name);

        new BeanDAO().createBean(B, list);

        list.add("servlet before RD");

        request.setAttribute("lsit", list);
        RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
        rd.forward(request, response);

BeanDAO.java:

package packone;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;

import org.hibernate.Session;

public class BeanDAO {

    public void createBean(Bean B, List<String> list) {
        Session session = null;
        try {
            list.add("START: DAO");
        session = new HibernateUtil().getSession(list); 
        list.add("Arriva Session");
        session.beginTransaction();
        session.save(B);
        session.getTransaction().commit();

        list.add("END: DAO");
        } catch(Exception e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            list.add(sw.toString());
        } finally {
            if(session != null) {
                session.flush();
                session.close();
            }
        }
    }

}

Let me know if you need more details or if question formatting needs improvement. Not an expert on Weblogic btw. Thanks.


Solution

  • Everything looks fine to me.

    Try using ojdbc6.jar instead of ojdbc14.jar. As your Oracle is version 11 and java is 8. ojdbc14.jar is very old now.

    Let me know if it works.