昨天使用hibernate循环批量保存一个联合主键类报出如下错误:
AbstractFlushingEventListener[line:301}: Could not synchronize database state with session
Could not execute JDBC batch update
联合主键类配置如下:
<hibernate-mapping>
<class name="com.vcmchina.credithour.model.SzGcEvaResult" table="sz_gc_eva_result" >
<composite-id name="id" class="com.vcmchina.credithour.model.SzGcEvaResultId">
<key-property name="stuNo" type="java.lang.String">
<column name="stu_no" length="20" />
</key-property>
<key-property name="projectCode" type="java.lang.String">
<column name="project_code" length="20" />
</key-property>
<key-property name="weekNo" type="java.lang.Integer">
<column name="week_no" />
</key-property>
<key-property name="syCode" type="java.lang.String">
<column name="sy_code" length="20" />
</key-property>
<key-property name="semSection" type="java.lang.String">
<column name="sem_section" length="10" />
</key-property>
<key-property name="suNo" type="java.lang.String">
<column name="su_no" length="20" />
</key-property>
<key-property name="semNo" type="java.lang.String">
<column name="sem_no" length="20" />
</key-property>
</composite-id>
<property name="secType" type="java.lang.String">
<column name="sec_type" length="10" not-null="true" />
</property>
<property name="graType" type="java.lang.String">
<column name="gra_type" length="10" not-null="true" />
</property>
<property name="semFlag" type="java.lang.String">
<column name="sem_flag" length="10" not-null="true" />
</property>
<property name="evaScore" type="java.lang.Integer">
<column name="eva_score" not-null="true" />
</property>
<property name="recordData" type="java.lang.String">
<column name="record_data" length="30" not-null="true" />
</property>
<property name="empName" type="java.lang.String">
<column name="emp_name" length="50" not-null="true" />
</property>
</class>
</hibernate-mapping>
////////////////////////////////////////////////
开始采用的是
public void addSzGcEvaResult(SzGcEvaResult evaResult) {
// TODO Auto-generated method stub
this.getHibernateTemplate().save(evaResult);
}
后来改用merge方法就没有问题了:
public void addSzGcEvaResult(SzGcEvaResult evaResult) {
// TODO Auto-generated method stub
this.getHibernateTemplate().merge(evaResult);
}
我感觉是对象状态的问题,因为我给对象实例化了联合主键,hibernate 认为它不再是瞬态,而是托管状态。
save() --瞬态状态调用,状态变为持久(POJO)
merge()--脱管状态时候调用,状态不变
分享到:
相关推荐
- **创建(CREATE)**:使用`Session.save()`或`Session.persist()`方法将对象保存到数据库。 - **读取(READ)**:`Session.get()`或`Session.load()`用于根据主键获取对象,`Query`和`Criteria`接口提供了更复杂的查询...
2. 联合主键:支持多个字段构成的复合主键。 3. 异步操作:利用Hibernate的异步API,提高系统响应速度。 4. 数据库分页:Query对象提供了分页查询的功能。 5. 动态模型:允许在运行时动态构建查询,增强了灵活性。 ...
它通过映射Java类到数据库表,使得开发人员可以专注于业务逻辑,而无需过多地关注SQL的编写。 ### 二、Hibernate 架构 Hibernate 包含了多个组件,如 Configuration、SessionFactory、Session、Query 等。理解这些...
Hibernate 支持类的继承映射,可以将继承层次结构映射到数据库的单表或多表。具体有三种策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)和表-per-class-hierarchy(Table per ...
2. 联合主键:处理多个字段作为主键的情况。 3. 批量操作:`session.saveOrUpdateAll()`、`session.deleteAll()`等。 4. 分页查询:使用`FirstResult`和`MaxResults`限制返回结果数量。 **九、最佳实践** 1. 避免...
7. 提交事务:所有操作完成后,提交事务以保存到数据库。 8. 关闭资源:最后,关闭Session和SessionFactory以释放资源。 四、高级特性 1. 异步查询:使用Future或AsyncQuery,实现查询操作的异步化,提升应用响应...
3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过Hibernate API操纵数据库 3.5.1 Hibernate的初始化 3.5.2 访问Hibernate的Session接口 3.6 运行helloapp应用 3.6.1 创建运行本书范例的系统环境 ...
11. **继承映射(Inheritance Mapping)**:Hibernate支持单表继承、联合继承和表格 per 类型的继承策略,使对象模型的继承结构能够映射到数据库中。 12. **懒加载(Lazy Loading)**:这是一种优化策略,允许延迟...
持久化类(Persistent Classes)是指那些被Hibernate管理的Java对象,它们通过Hibernate映射到数据库表。一个简单的持久化类示例可以是一个POJO(Plain Old Java Object),其中包含基本的数据成员和业务逻辑。为了...
9. 批量操作:Hibernate提供了批处理功能,如`batch_size`属性用于控制批量保存或更新的大小,以及`StatelessSession`用于高效的大规模数据处理。 10. 性能优化:包括延迟加载(Lazy Loading)、缓存策略调整、...
10. **联合主键与复合主键**:在处理多字段主键时,需要理解如何在实体类和映射文件中配置联合主键或复合主键。 11. **实体继承策略**:Hibernate支持单表继承、联合继承和表-per-hierarchy等多种继承策略,根据...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
2. **避免使用联合主键**:联合主键虽然可以满足某些特定的需求,但往往会增加查询复杂度,尤其是在使用外键的情况下。如果可能,尽量使用单一字段作为主键。 3. **ID 生成机制**:不同的数据库有不同的 ID 生成...
- **联合主键**:当实体类拥有多个主键时,需要特别配置联合主键策略。 #### 六、Hibernate 核心开发接口 - **项目**: `hibernate_0500_CoreAPI` - **API 文档**:建议查阅官方文档获取最新信息。 - **接口介绍**:...
Hibernate的批处理功能可以提高性能,例如,通过`Session.saveOrUpdateAll()`方法批量保存实体,或使用`Query.setFetchSize()`设置查询结果集大小。 以上就是“hibernate-biji”中涉及的一些关键知识点。通过学习...
2. **避免使用联合主键**:联合主键虽然有助于确保唯一性,但在实际使用过程中会增加维护成本,并可能导致查询性能下降。 3. **ID生成机制的选择**:不同数据库提供的ID生成策略各异,例如序列、触发器、GUID等,...
向 OrderLine 的引用都应该通过 Order 实体来完成,因为 OrderLine 没有自己的标识符,它的唯一性由 Order 的联合主键决定。1.3 继承映射Hibernate 支持单表继承(Single Table Inheritance)、联合继承( Joined ...
Hibernate支持批处理操作,如批量保存、更新和删除,以减少数据库交互次数,提升性能。 11. **查询优化** Hibernate提供了SQL的批注生成,允许开发者手动优化生成的SQL,以适应特定的数据库环境。此外,优化HQL和...
组件映射允许将Java对象的字段或属性映射到数据库中的复合类型或联合主键。文档讲解了依赖对象、动态组件以及组件作为Map的索引或联合标识符的映射方法,提高了代码的可读性和维护性。 ### 继承映射 继承映射策略...
Hibernate支持设置批处理大小,通过`Session.flush()`方法强制刷新缓存中的操作,批量提交到数据库。 8. **级联操作** 级联操作允许在一个实体的操作中自动处理其关联的实体。例如,`CascadeType.ALL`将使保存、...