2013-05-09 3 views
0

[Это может быть полезно, чтобы увидеть мой связанный, но отличный, вопрос от ранее сегодня здесь Hibernate Schema Export in Eclipse.]Странная NumberFormatException в Hibernate При использовании SessionFactory

я следующий класс Java

package com.examscam.model; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 
import org.hibernate.tool.hbm2ddl.SchemaExport; 

@Entity 
public class User { 
    private Long id; 
    private String password; 

    @Id 
    @GeneratedValue 
    public Long getId() { 
     return id; 
    } 

    public String getPassword() { 
     return password; 
    } 

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

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public static void main(String[] args) { 
     AnnotationConfiguration config = new AnnotationConfiguration(); 
     config.addAnnotatedClass(User.class); 
     config.configure(); 
//  new SchemaExport(config).create(true, true); 

     SessionFactory factory = config.buildSessionFactory(); 
     Session session = factory.getCurrentSession(); 
     session.beginTransaction(); 

     User u = new User();   
     u.setPassword("abc123"); 

     session.saveOrUpdate(u); 
     session.getTransaction().commit(); 

     System.out.println("Done."); 
    } 
} 

У меня есть базы данных и (MySQL) создали таблицу Пользователь с кодом

create table User (id integer not null auto_increment, password varchar(255), primary key (id)) 

Однако, когда я пытаюсь работает этот код, я дал следующий стек Trac е

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:470) 
    at java.lang.Integer.valueOf(Integer.java:554) 
    at org.hibernate.util.PropertiesHelper.getInteger(PropertiesHelper.java:37) 
    at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:47) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) 
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 
    at com.examscam.model.User.main(User.java:40) 

Line 40 класса User является

SessionFactory factory = config.buildSessionFactory(); 

Кто-нибудь есть какие-либо идеи, почему это происходит? Я не вхожу в пустую строку в этой строке, и я скопировал код именно из книги. Я не сомневаюсь, что книга верна; мои вопросы больше похожи на «Может ли кто-нибудь подумать о какой-либо причине (ошибки в xml-файлах, проблемах с упорядочением классов, файлы, не находящиеся в правильных каталогах и т. д.), почему это поведение произойдет?».

Ответ на этот вопрос также может помочь решить проблему в ссылке в самой верхней части этой страницы с экспортом схемы.

Thanks, Conor.

ответ

1

Таким образом, я считаю, что я решил эту проблему, в результате которой возникли две проблемы. Во-первых, в classpath была еще одна более старая версия спящего режима. Эта более старая версия нуждалась в конфигурационных элементах, которые больше не требовались, что приводило к , поскольку он пытался разобрать пустую строку в int для отсутствующего элемента конфигурации изоляции транзакции.

После фиксации, что мы начали видеть NullPointerException на эту строку кода:

Environment.class.getClassLoader().getResourceAsStream(stripped); 

Глядя на этой строке кода, единственное, что можно было бы метание NPE был getClassLoader вызов, но как это могло быть когда-либо? Как оказалось, getClassLoader может возвращать значение null, если возвращаемый загрузчик класса является загрузчиком загрузочного класса. Я попросил Конора проверить, переместил ли он спящий режим в класс загрузки, и оказалось, что он это сделал. Исправление из класса загрузки устранило проблему.

Так два урока здесь:

  1. тщательно Управление класса путь. Знайте, что на нем, и держите его как можно более аккуратным. Чем меньше сторонних библиотек, тем лучше.
  2. Никогда не кладите вещи на путь класса загрузки. Если вы решите игнорировать это правило, поймите, каковы потенциальные последствия, поэтому вы не застреваете в таких проблемах.
+0

Я предоставил свою полную запись для hibernate.cfg.xml на странице, с которой я связался в tope сообщения, но он просто содержит hibernate.connection.url, hibernate.connection.username, hibernate.connection.password, hibernate. connection.driver_class, hibernate.dialect, hibernate.transaction.factory_class, hibernate.current_session_context_class и hibernate.show_sql. Опять же, я скопировал этот код точно так же, как и из книги. Сказав это, он немного устарел. Можете ли вы придумать что-нибудь еще, что мне нужно? Сегодня утром я загрузил все спящие баночки, так что это должна быть самая последняя версия. – ConorW

+0

Здесь важна точная версия спящего режима, так как она подсказывает мне, на каком исходном коде стоит посмотреть. Можете ли вы дать мне точную версию? – cmbaxter

+0

Ядро спящего режима, которое я использую, - это hibernate-core-4.2.0.Final.jar. Это то, что вам нужно [я что-то новичок]? – ConorW

0

Тип данных столбца id базы данных является целым числом, но тип данных идентификатора объекта класса long, не уверен, является ли это проблемой. Но стоит попытаться изменить тип данных идентификатора объекта на int.

+0

Я понял, что вы имеете в виду, и я поменял Long на Integer, если это необходимо, но я все равно получаю исключение NumberFormatException, поэтому я думаю, что это не так. Спасибо, в любом случае. – ConorW

Смежные вопросы