Java Hibernate与MySQL插入查询不一致

Java Hibernate与MySQL插入查询不一致,java,hibernate,jsf,netbeans,jakarta-ee,Java,Hibernate,Jsf,Netbeans,Jakarta Ee,这个问题快把我逼疯了。基本上,我已经设置了一个到java类的hibernate映射。该类将执行插入表的操作。但事实并非如此。开始时,由于超时,我正在锁定Hibernate。第二,它起作用了,然后就不起作用了 仅供参考,我正在使用随附的netbeans 6.9.1和Hibernate 3。而且..最奇怪的是,当我在调试模式下运行程序时,(在调试模式下放置断点,程序从一行到另一行缓慢爬行),我可以得出结论,仅仅初始化sessionFactory大约需要5秒钟。这可能是被锁起来的主要原因 我做错了什么

这个问题快把我逼疯了。基本上,我已经设置了一个到java类的hibernate映射。该类将执行插入表的操作。但事实并非如此。开始时,由于超时,我正在锁定Hibernate。第二,它起作用了,然后就不起作用了

仅供参考,我正在使用随附的netbeans 6.9.1和Hibernate 3。而且..最奇怪的是,当我在调试模式下运行程序时,(在调试模式下放置断点,程序从一行到另一行缓慢爬行),我可以得出结论,仅仅初始化sessionFactory大约需要5秒钟。这可能是被锁起来的主要原因

我做错了什么?仅供参考,我正在本地主机中使用LAMPP for mysql

下面是Hibernate配置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.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>
这就是我所说的:

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


    }

有什么想法吗?

首先,取消对源代码的注释以进行事务划分,因此代码中没有定义任何事务。请取消注释行
session.getTransaction().begin()
会话.getTransaction().commit()

此外,在finally块中没有必要执行flush()。刷新但此后永不提交意味着刷新期间所做的所有更改都不会保存到数据库中。可以使用
session.setFlushMode()
控制刷新行为。默认情况下,它是
FlushMode.AUTO
,hibernate将在提交事务时自动执行刷新(
session.getTransaction().commit();
),因此您可以删除行
session.flush()

此外,一个
SessionFactory
应该代表一个数据库。创建
SessionFactory
非常昂贵,但是创建
会话
非常便宜。因此,您应该创建一个
SessionFactory
实例,并使用这个
SessionFactory
在整个应用程序中创建所有
会话

Netbean的内置hibernate工具可以创建一个实用程序类来获取单个
SessionFactory
实例。请参阅
创建HibernateUtil.java帮助文件


`

您能在hibernate之外很好地连接到mysql吗?您是否尝试过启用hibernate sql日志以查看它正在执行什么?你试过监控mysql查询吗?是的,我可以。事实上,在同一个项目中,有些页面使用正常、痛苦的JDBC编程进行连接。那些页面运行得又快又好。但是当谈到使用hibernate的页面时……发生了这种情况。。。我太无知了…Jtahlborn:我如何启用和查看hibernate sql日志?谷歌热门:信息:hibernate:插入应用程序crs信息(课程名称、描述、级别、ID)值(?,,?,?)。日志上是这么说的。这很奇怪,当我进行调试时,参数被正确解析(即,课程成员变量被相应地设置),感谢您提供的信息。我注意到Hibernate花了很多时间来实例化sessionFactory。有没有什么方法可以在web应用程序第一次加载时生成它?例如,在.NET中,我可以在index.htm的页面上实例化它
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();
        }


    }