Как решить следующее исключение ServiceException в приложении Hibernate Weblogic (JNDI)?

#java #oracle #hibernate #weblogic #jndi

#java #Oracle #переход в спящий режим #weblogic #jndi

Вопрос:

У меня есть JNDI, созданный на моем сервере Weblogic 12c. Я пытаюсь подключиться к базе данных Oracle на сервере, используя datasource, и создать там таблицу, используя hibernate. Но я продолжаю получать одно и то же исключение org.hibernate.service.spi.ServiceException: не удается создать запрошенный сервис [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] Часть 1 часть 2. Это исключение возникает после того, как я отправляю идентификатор и имя из index.jsp Пожалуйста, посмотрите мой Java-код и предложите любые изменения:

Версии: Java 8 Weblogic 12c Hibernate 5 Oracle 11g

Структура проекта

Файлы Jar

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:
Просто содержит список файлов приветствия в виде 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();
            }
        }
    }

}
  

Дайте мне знать, если вам нужны дополнительные сведения или если форматирование вопроса нуждается в улучшении. Кстати, не эксперт по Weblogic. Спасибо.

Ответ №1:

Для меня все выглядит нормально.

Попробуйте использовать ojdbc6.jar вместо ojdbc14.jar . Поскольку ваш Oracle имеет версию 11, а java — 8. ojdbc14.jar сейчас оно очень старое.

Дайте мне знать, если это сработает.

Комментарии:

1. В вашем hibernate.cfg.xml файл: <имя свойства=»hibernate.connection.datasource»> java: comp / env / jdbc/Abc</property>. Вы уверены, что эта часть верна? В качестве общего синтаксиса для этого используется: java: comp / env / jdbc /yourJndiNameDS. Проверьте его значение в источнике данных weblogic, если оба совпадают.

2. Да, это была проблема. В weblogic я указал только jdbc / ABCDs. Это сработало после изменения. Спасибо.