Несоответствие гибернации с MySQL Insert Query - PullRequest
1 голос
/ 11 марта 2011

Эта проблема сводит меня с ума.По сути, я настроил отображение hibernate на класс java.Класс сделает вставку в таблицу.Но этого не происходит.Вначале я блокирую Hibernate из-за тайм-аута.Во-вторых, это работало, а потом не работало.

Для вашей информации, я использую NetBeans 6.9.1 и Hibernate 3, которые поставлялись вместе с ним.И ... самое странное, что когда я запустил программу в режиме отладки (где вы устанавливаете точки останова и программа медленно сканирует строку за строкой), я могу заключить, что для инициализации sessionFactory требуется около 5 секунд ПРОСТО.Вероятно, это главная причина блокировки.

Что я сделал не так?К вашему сведению, я использую LAMPP для mysql на локальном хосте.

Вот XML-файл конфигурации Hibernate

 <?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.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/rainbow</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">password</property>
    <mapping resource="hibernate.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

А вот отображение xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="datamap.Course" table="app_crs_info">
      <id name="id" column="ID" type="string"/>
      <property name="courseName" type="string">
          <column name="COURSE_NAME"/>
      </property>
      <property name="description" type="string">
          <column name="DESCRIPTION"/>
      </property>
      <property name="level" type="integer">
          <column name="LEVEL"/>
      </property>
  </class>
</hibernate-mapping>

Этосопоставленный класс:

public class Course {
    private String id;
    private String courseName;
    private String description;
    private int level;

    /**
     * @return the id
     */
    public String getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return the courseName
     */
    public String getCourseName() {
        return courseName;
    }

    /**
     * @param courseName the courseName to set
     */
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    /**
     * @return the description
     */
    public String getDescription() {
        return description;
    }

    /**
     * @param description the description to set
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * @return the level
     */
    public int getLevel() {
        return level;
    }

    /**
     * @param level the level to set
     */
    public void setLevel(int level) {
        this.level = level;
    }
}

И вот как я это назвал:

public void registerCourse(String id, String description,
                                String name, String level) {
       session = null;
       crashLog = new CrashLog();


        try {

            SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            session = sessionFactory.openSession();
            //session.getTransaction().begin();

            Course course = new Course();
            course.setId(id);
            course.setCourseName(name);
            course.setDescription(description);
            course.setLevel(Integer.parseInt(level));
            session.save(course);
            //session.getTransaction().commit();
        } catch (Exception ex) {
            crashLog.writeToLog(CourseData.class.getName() + "Error : " + ex.toString());
        } finally {
            session.flush();
            session.close();
        }


    }

Есть идеи, ребята?

1 Ответ

0 голосов
/ 12 марта 2011

Во-первых, вы раскомментируете источник для разграничения транзакций, поэтому в вашем коде нет транзакций, определенных внутри. Пожалуйста, раскомментируйте строки session.getTransaction().begin(); и session.getTransaction().commit();

Более того, нет смысла делать flush () в вашем блоке finally. Сброс, но никогда не фиксировать после этого означает, что все ваши изменения, сделанные во время сброса, не будут сохранены в базе данных. Поведение промывки можно контролировать с помощью session.setFlushMode(). По умолчанию это FlushMode.AUTO, когда hibernate автоматически выполнит сброс при фиксации транзакции (session.getTransaction().commit();), поэтому вы можете удалить строку session.flush();

Более того, одна SessionFactory должна представлять одну базу данных. Создание SessionFactory обходится дорого, но создание session обходится крайне недорого. Таким образом, вы должны создать один SessionFactory экземпляр и использовать этот единственный SessionFactory для создания всех Session во всем приложении.

Встроенный инструмент Netbean в спящем режиме может создать служебный класс для получения одного SessionFactory экземпляра. Пожалуйста, обратитесь к Creating the HibernateUtil.java Helper File на http://netbeans.org/kb/docs/web/hibernate-webapp.html

enter image description here

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...