Hibernate不保存我的对象

时间:2015-07-19 19:55:41

标签: java hibernate

我在Hibernate进行自我训练。 我刚刚发现了一些我无法解释的好奇行为。

我正在使用Hibernate 4.3.10和Java 8

我希望你能帮我理解发生的事情。 为了更加明确,请参阅以下代码示例:

public static long createBlindStructure(BlindStructure pBlindStructure){
    Transaction tcx = null;
    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.openSession();
    int id = -1;
    try{
        tcx = session.beginTransaction();
        id = session.save(pBlindStructure);
        tcx.commit();
    }
    catch( Throwable e){
        tcx.rollback();
    }
    finally{
        session.close();
    }
    return id;
}

在我看来,这个方法保存了开放的会话和事务,保存了我的对象并关闭了会话和事务。从保存我试图找回javadoc中描述的标识符。但它不起作用,我看到请求在我的日志中执行(感谢hibernate调试模式)。

Hibernate: insert into PokerLeagueManager.blindStructure (structureJson) values (?)

但是当我尝试这个时:

public static long createBlindStructure(BlindStructure pBlindStructure){
    Transaction tcx = null;
    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.openSession();
    try{
        tcx = session.beginTransaction();
        session.save(pBlindStructure);
        tcx.commit();
    }
    catch( Throwable e){
        tcx.rollback();
    }
    finally{
        session.close();
    }
    return pBlindStructure.getIdBlindStructure();
}

它正确保存我的对象。

我再测试一个案例: 只返回一个常量并且不要像在第一个例子中那样将Id放在变量中并且它可以工作。似乎对象不是保存,以防我直接使用" session.save"方法

此外,我观察到一些有趣的事情。我使用其中一个解决方案进行了第一次测试,它生成了一个带有Id 117的数据库数据。然后我更改了我的代码,找不到工作并在tomcat中重新加载的解决方案,我试了2次但没有成功。我再次更改我的代码,成功和生成的ID为120.它错过了2个ID号(我尝试了2次尝试?)

帮助您查看我的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>
    <!-- Database connection settings -->
    <property     name='connection.driver_class'>com.mysql.jdbc.Driver</property>
    <property name='connection.url'>jdbc:mysql://XXXXXX:XXXX/PokerLeagueManager</property>
    <property name='connection.username'>XXXXX</property>
    <property name='connection.password'>XXXXXX</property>
    <property name="show_sql">true</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>
    <property name="hibernate.c3p0.idle_test_period">120</property>
    <property name="hibernate.c3p0.min_size">1</property>
    <property name="hibernate.c3p0.max_size">10</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.timeout">120</property>
    <property name="hibernate.c3p0.acquireRetryAttempts">1</property>
    <property name="hibernate.c3p0.acquireRetryDelay">250</property>
    <!--  Dev -->
    <property name="hibernate.c3p0.validate">true</property>

    <!-- SQL dialect -->
    <property name='dialect'>org.hibernate.dialect.MySQL5InnoDBDialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>


    <!-- Echo all executed SQL to stdout -->
    <property name='show_sql'>true</property>

    <mapping resource="mappings/BlindStructure.hbm.xml"/>
    <mapping resource="mappings/Tournament.hbm.xml"/>
    <mapping resource="mappings/LegalFee.hbm.xml"/>
</session-factory>

编辑:User3813463回答部分问题。它解释了默认情况下会话处于AUTO刷新模式,在某些情况下刷新会话如:

  默认情况下,

刷新在以下几点发生:

     
      
  • 在执行某些查询之前

  •   
  • 来自org.hibernate.Transaction.commit()

  •   来自Session.flush()的
  •   

但我的观点(我可能想念一些事情),我的第一个案例应该有效,因为我提交了我的交易。 其次,我需要建议选择冲洗模式。在我看来,提交模式是一种很好的方法,只能在数据库中插入或只读取数据。

你是否同意我的意见,请问一些有争议的消息来源?

2 个答案:

答案 0 :(得分:1)

这一切都是FlushMode阅读文档here

的神奇之处

根据文档默认FlushModeAUTO,这意味着

  

在查询执行之前,有时会刷新会话   确保查询永远不会返回陈旧状态。

根据另一份文件(Here):

  默认情况下,

flush出现在以下几点:

     在某些查询执行之前

     

来自org.hibernate.Transaction.commit()

     

来自Session.flush()

所以当你说pBlindStructure.getIdBlindStructure(); hibernate实际上在当前会话中执行flush,结果数据被保存在DB中。

答案 1 :(得分:0)

session save方法返回生成器生成的id的对象。您应该将此值转换为nav { position: relative; top: 25px; left: 290px; } nav ul { margin: 0; padding: 0; list-style-type: none; underline: none; } nav ul li { display: inline; margin: 0px 20px 0px 0px;} nav ul li a { color: red; font-size: 14px; text-decoration: none;}

Long