Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Ошибка java.lang.NoClassDefFoundError: org/apache/


Автор: nikss 14.7.2007, 13:38
Приветствую! Сложилась такая проблема: разбираюсь с hibernate, сделал все по примеру. Пытаюсь запустить в NetBeans - выдает ошибку:
Цитата

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at Utils.HibernateOperations.main(HibernateOperations.java:18)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

Код:
Цитата


package Utils;

import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;


// Используется, как:
// java InsertProduct <название> <количество> <цена>
public class HibernateOperations {

public static void main(String[] args) throws Exception {

// 1. Создаем объект класса Product
Products p = new Products();
p.setNaimen(args[0]);
p.setAmount(Integer.parseInt(args[1]));
p.setPrice(Double.parseDouble(args[2]));

// 2. Настраиваем Hibernate
Configuration cfg = new Configuration().addClass(Utils.Products.class);
SessionFactory sf = cfg.buildSessionFactory();

// 3. Открываем Session
Session sess= sf.openSession();
// 4. Сохраняем Product и закрываем Session
Transaction t= sess.beginTransaction();
sess.save(p);
t.commit();
sess.close();
}
}


Подскажите, пожалуйста, где ошибка?

Автор: tux 14.7.2007, 15:15
Видимо здесь ошибка, параметры в программу не переданы.
Код

p.setNaimen(args[0]);

Автор: nikss 14.7.2007, 15:21
Спасибо, tux! Ты был прав. Теперь пишу так: 

p.setNaimen("Хлеб");
p.setAmount(3);
p.setPrice(1.7);

Получаю ошибку:
Цитата

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:120)
        at Utils.HibernateOperations.main(HibernateOperations.java:25)



Автор: tux 14.7.2007, 15:47
Нужна библиотека commons-logging.jar.

Автор: nikss 14.7.2007, 16:24
Добавил.

Теперь не пойму по результатам компиляции:
Код

init:
deps-jar:
compile:
run:
14.07.2007 16:23:49 org.hibernate.cfg.annotations.Version <clinit>
INFO: Hibernate Annotations 3.3.0.GA
14.07.2007 16:23:49 org.hibernate.cfg.Environment <clinit>
INFO: Hibernate 3.2.4.sp1
14.07.2007 16:23:49 org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
14.07.2007 16:23:49 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
14.07.2007 16:23:49 org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
14.07.2007 16:23:49 org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
14.07.2007 16:23:49 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
14.07.2007 16:23:49 org.hibernate.cfg.Configuration doConfigure
INFO: Configured SessionFactory: null
14.07.2007 16:23:49 org.hibernate.cfg.Configuration addClass
INFO: Reading mappings from resource: Utils/Products.hbm.xml
14.07.2007 16:23:49 org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource: Utils/Products.hbm.xml
Exception in thread "main" org.hibernate.MappingNotFoundException: resource: Utils/Products.hbm.xml not found
        at org.hibernate.cfg.Configuration.addResource(Configuration.java:533)
        at org.hibernate.cfg.Configuration.addClass(Configuration.java:586)
        at Utils.HibernateOperations.main(HibernateOperations.java:26)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)


Получается, что необходим еще маппинг для класса Products.  Но в классе я использую аннотации:
Код

package Utils;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "PRODUCTS")
@NamedQueries( {
        @NamedQuery(name = "Products.findById", query = "SELECT p FROM Products p WHERE p.id = :id"),
        @NamedQuery(name = "Products.findByNaimen", query = "SELECT p FROM Products p WHERE p.naimen = :naimen"),
        @NamedQuery(name = "Products.findByPrice", query = "SELECT p FROM Products p WHERE p.price = :price"),
        @NamedQuery(name = "Products.findByAmount", query = "SELECT p FROM Products p WHERE p.amount = :amount")
    })
public class Products implements Serializable {

    @Id
    @Column(name = "ID", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "NAIMEN", nullable = false, length=32)
    private String naimen;

    @Column(name = "PRICE", nullable = false)
    private double price;

    @Column(name = "AMOUNT", nullable = false)
    private int amount;
    
    public Products(Integer id) {
        this.id = id;
    }

    public Products(Integer id, String naimen, double price, int amount) {
        this.id = id;
        this.naimen = naimen;
        this.price = price;
        this.amount = amount;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNaimen() {
        return this.naimen;
    }

    public void setNaimen(String naimen) {
        this.naimen = naimen;
    }

    public double getPrice() {
        return this.price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getAmount() {
        return this.amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {

        if (!(object instanceof Products)) {
            return false;
        }
        Products other = (Products)object;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
        return true;
    }

    @Override
    public String toString() {
        return "Utils.Products[id=" + id + "]";
    }
    
}

Чего-то я недопонимаю. 

Автор: tux 14.7.2007, 16:42
Цитата(nikss @  14.7.2007,  16:24 Найти цитируемый пост)
Получается, что необходим еще маппинг для класса Products. 

Маппинг необходим очевидно потому что ты его в hibernate.cfg.xml написал.

Автор: nikss 14.7.2007, 16:45
Нет. Вот hibernate.cfg.xml:
Код

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.driver_class">
      org.firebirdsql.jdbc.FBDriver
    </property>
    <property name="hibernate.connection.password">
      masterkey
    </property>
    <property name="hibernate.connection.url">
      jdbc:firebirdsql://localhost:3050/d:/work/hibernate.gdb
    </property>
    <property name="hibernate.connection.username">
      SYSDBA
    </property>
    <property name="hibernate.dialect">
      org.hibernate.dialect.FirebirdDialect
    </property>
    <property name="current_session_context_class">thread</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
  </session-factory>
</hibernate-configuration>


Добавлено через 9 минут и 20 секунд
Удалил файл hibernate.cfg.xml из проекта - ошибка осталась. Похоже, что я не туда выложил hibernate.cfg.xml.

tux, подскажи, плиз, куда нужно сохранять данный файл?

Автор: tux 14.7.2007, 16:58
Цитата(nikss @  14.7.2007,  16:45 Найти цитируемый пост)
куда нужно сохранять данный файл? 

Туда, где у тебя классы лежат. Но насколько я вижу, его Hibernate подхватил. Как Hibernate настраивать на работу с аннотациями, не знаю.

Автор: nikss 14.7.2007, 17:00
Вот мое дерево папок:
Код

test
/├───build
│   └───classes
│       ├───hibernate
│       ├───META-INF
│       └───Utils
├───dist
│   └───lib
├───lib
├───nbproject
│   └───private
├───src
│   ├───META-INF
│   └───Utils (пакет, в котором находится main-класс)
└───test

Автор: tux 14.7.2007, 17:18
Если классы в test/build/classes, то туда.

Автор: nikss 14.7.2007, 17:50
Спасибо, tux! Все получилось! Пересобрал проект и он заработал! smile 
Маппинг перед этим действительно написан был в hibernate.cfg.xml. Видимо Netbean где-то в кэше держал. 
Короче все ок! Спасибо за помощь.

Автор: nikss 16.7.2007, 18:05
Наткнулся на новую проблему! Пытаюсь внести данные через пул к БД. Написал свой класс:
Код

package HibernateUtils;

import java.util.*;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class JDBCPool {
    private static JDBCPool connection=null;
    private static Session session=null;
    
    private JDBCPool() {
    }
    
    public synchronized static JDBCPool getInstance()
    {
        if (connection==null) 
        {
            connection=new JDBCPool();
        }
        return connection;
    }
    
    public static Session getSession() {
        if (getInstance().session==null) 
        {     
             AnnotationConfiguration aconf = new AnnotationConfiguration().addPackage("nikss.mapping");
             Configuration cfg = aconf.configure();
             SessionFactory factory = cfg.buildSessionFactory();
             getInstance().session= factory.openSession();
        }
        return getInstance().session;
    }
}

package HibernateUtils;

import org.hibernate.Session;
import org.hibernate.Transaction;
public class Transactions {
    private Session session=JDBCPool.getInstance().getSession();
    
    public Transactions() {
    }
    
    public void Save(Object object){
        Transaction transaction=this.session.beginTransaction();
        
        try 
        {
            this.session.save(object);
            
            transaction.commit();
            System.out.println(transaction.wasCommitted());
        }
        catch (Exception e) 
        {
            transaction.rollback();
        }
    }
    
    public void Delete(Object object)
    {
        Transaction transaction=this.session.beginTransaction();
        try 
        {
            this.session.delete(object);
            transaction.commit();
            System.out.println(transaction.wasCommitted());
        }
        catch (Exception e) 
        {
            transaction.rollback();
        }
    }
}

Поля таблиц заполняю через бины (сервер Tomcat):
Код

package TEST;

import HibernateUtils.JDBCPool;
import HibernateUtils.Transactions;
import HibernateUtils.Transactions;

import nikss.mapping.*;
import org.hibernate.Transaction;

public class Bean {
    private String naimen;
        private Double price;
        private Integer amount;
        
        public String getNaimen(){
            return this.naimen;
        }
        public void setNaimen(String s){
            this.naimen=s;
        }
        
        public Integer getAmount(){
            return this.amount;
        }
        
        public void setAmount(Integer i){
            this.amount=i;
        }
        
        public Double getPrice(){
            return this.price;
        }
        
        public void setPrice(Double d){
            this.price=d;
        }
        
        public void insert(){
            Products p=new Products();
            p.setAmount(this.amount);
            p.setPrice(this.price);
            p.setNaimen(this.naimen);
            Transactions t=new Transactions();
            t.Save(p);
           
        }
}

После вызова метода Bean.insert() данные не заполняются в таблицу, но генератор постоянно наращивает свое значение. При этом, никаких ошибок не возникает. 
Требуется дельный совет. Спасибо.

Добавлено через 3 минуты и 43 секунды
P.S. Значение генератора я смотрел в СУБД - наращивается безупречно. СУБД использую Firebird.

Автор: nikss 17.7.2007, 09:26
Разобрался! smile Блин, сам с собой переписываюсь! smile
Необходимо было в hibernate.cfg.xml прописать такой URL к БД:
 <property name="hibernate.connection.url">
      jdbc:firebirdsql://localhost:3050/d:/work/hibernate.gdb?lc_ctype=WIN1251
 </property>
Причем без указания кодировки сохранялись записи только на латинской раскладке клавиш.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)