我在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刷新模式,在某些情况下刷新会话如:
默认情况下,刷新在以下几点发生:
在执行某些查询之前
- 来自Session.flush()的
来自org.hibernate.Transaction.commit()
但我的观点(我可能想念一些事情),我的第一个案例应该有效,因为我提交了我的交易。 其次,我需要建议选择冲洗模式。在我看来,提交模式是一种很好的方法,只能在数据库中插入或只读取数据。
你是否同意我的意见,请问一些有争议的消息来源?
答案 0 :(得分:1)
这一切都是FlushMode
阅读文档here
根据文档默认FlushMode
是AUTO
,这意味着
在查询执行之前,有时会刷新会话 确保查询永远不会返回陈旧状态。
根据另一份文件(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