最近在学习hibernate的文档,按照它提供的例子写了一个写入通过OR映射保存数据并用hql查询的测试程序,发现了一个奇怪的问题:
就是插入的数据再次查询就不见了,插入数据的程序执行后可以在数据库中查找到,但是执行一次hql查询后就不见了
这是插入数据的程序:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Person p = new Person();
p.setName("zxy");
session.save(p);
session.getTransaction().commit();
这是查询数据的程序:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
System.out.println("list: "+session);
session.beginTransaction();
List<Person> persons = session.createQuery("from Person ").list();
session.getTransaction().commit();
我的分析思路是这样的,因为我用的是oracle数据库,所以我确定这些数据确实是已经提交了的。我就猜想可能是hibernate的某个参数配置错误了,但是我对hibernate不熟悉,不知道具体的配置位置,只好通过排除法一段一段debug代码来确定hibernate是在什么时候删除了我创建的数据。
我发现在创建SessionFactory后数据就消失了,跟到org.hibernate.impl.SessionFactoryImpl中的371行时发现有这样一个判断
if ( settings.isAutoCreateSchema() ) {
new SchemaExport( cfg, settings ).create( false, true );
}
然后又看到了SchemaExport的构造方法
public SchemaExport(Configuration cfg, Settings settings) throws HibernateException {
dialect = settings.getDialect();
connectionHelper = new SuppliedConnectionProviderConnectionHelper( settings.getConnectionProvider() );
dropSQL = cfg.generateDropSchemaScript( dialect );
createSQL = cfg.generateSchemaCreationScript( dialect );
sqlStatementLogger = settings.getSqlStatementLogger();
formatter = ( sqlStatementLogger.isFormatSql() ? FormatStyle.DDL : FormatStyle.NONE ).getFormatter();
importFiles = settings.getImportFiles() != null ? settings.getImportFiles() : DEFAULT_IMPORT_FILE;
}
真相在这里大白了,这里生成的dropSQL会删除我OR映射创建的所有表,然后在重新创建一次。
后来我在网上查了查,原来是我hibernate.cfg.xml中一个配置项配错了
<property name="hbm2ddl.auto">create</property>
这里改成none就好了。
顺便记录下hibernate.cfg.xml中属性 hbm2ddl.auto的值含义:
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop 加载hibernate时创建,退出时删除表结构
update 加载hibernate自动更新数据库结构
建议设置成none,也就是什么也不做。
留个脚印,这个问题烦恼了我一天,留待以后参考。
分享到:
相关推荐
在保存或更新带有Clob和Blob字段的实体时,Hibernate会自动处理这些数据的插入和更新操作。例如,当你调用`session.saveOrUpdate(entity)`或`entityManager.persist(entity)`时,Hibernate会将Clob和Blob的内容正确...
整合Spring MVC、Spring 4 和 Hibernate 5 需要配置Spring的ApplicationContext.xml,定义数据源、SessionFactory、事务管理器等。同时,需要配置Spring MVC的DispatcherServlet配置文件,设置视图解析器和处理器...
使用这三个jar包,开发者可以在保存数据之前,通过调用Hibernate提供的验证方法,检查模型对象是否满足预设的验证规则。例如,可以确保必填字段不为空,字符串长度在指定范围内,或者日期格式正确等。如果数据不符合...
- 当你保存或更新一个子实体时,如果启用了级联操作,Hibernate会自动处理与之关联的父实体,确保数据的一致性。 7. **级联删除**: - 要小心使用`CascadeType.DELETE`,因为它可能导致意外删除。如果一个父实体...
缓存失效是指缓存中的数据由于某种原因变得无效或过期。在Hibernate中,可以通过以下方式触发缓存失效: - **数据更新**:当缓存中的数据被更新后,旧数据会从缓存中移除。 - **显式清除**:可以显式调用`evict()`...
在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据访问。本话题将深入探讨“Hibernate性能测试代码”,以帮助我们理解如何有效地评估和...
Hibernate是一个开源的ORM框架,它提供了一种在Java应用中操作数据库的便捷方式,通过将Java对象与数据库表进行映射,实现了数据的透明访问。这使得开发者可以避免编写大量的SQL语句,专注于业务逻辑的实现。 **二...
通过这个" Hibernate级联操作一对多demo ",开发者可以深入理解如何在实际项目中利用Hibernate的级联功能来简化代码,提高开发效率,同时也要注意潜在的风险和性能问题。在实践中不断优化,才能更好地掌握这一强大的...
如果数据无效,系统应该返回错误信息。 8. **最佳实践**: 在实际应用中,为了确保性能和用户体验,可能需要考虑异步处理大文件、分批读取和校验数据、异常处理以及友好的错误反馈机制等。 通过上述解释,我们可以...
1. **隐式事务**:`getCurrentSession()`默认开启了隐式事务,这可能导致开发者在没有显式开启事务的情况下进行数据库操作,从而引发数据一致性问题。 2. **多线程问题**:虽然SessionFactory是线程安全的,但是...
- **数据访问对象(DAO)**:使用Hibernate的Session接口操作数据库,如保存、查询用户信息。 - **服务层(Service)**:创建Service接口及实现,调用DAO方法,实现业务逻辑。 - **控制器(Controller)**:定义...
4. **事件监听器**: Hibernate提供了丰富的事件系统,可以通过监听器来扩展其功能,例如在对象保存、更新或删除时执行自定义逻辑。 5. **动态模型**: Hibernate支持动态模型,允许在运行时构建和修改映射,增强了...
总结来说,解决Hibernate4执行`save()`或`update()`无效问题的方法包括: 1. 检查主键设置:确保主键字段有正确的注解和配置,如`@GeneratedValue`和`@Id`。 2. 确认事务管理:确保操作在事务范围内,方法上添加`@...
- **null值处理**:对于非空约束的字段,Hibernate会自动处理null值,避免插入无效数据。 - **SQL查询**:除了使用HQL(Hibernate Query Language)和Criteria API,还可以使用原生SQL进行复杂查询。 - **缓存机制...
了解如何优化Hibernate,包括批处理、合理使用缓存、避免N+1查询问题、减少无效的数据库访问等策略。 通过阅读压缩包中的`Hibernate原理与配置快速入门.pdf`和`Hibernate_DEV_GUIDE.pdf`,你可以深入了解Hibernate...
3. **数据持久化**:在对象保存到数据库之前,先进行验证,避免无效数据的存储。 通过以上介绍,我们可以看出Hibernate Validator在数据验证方面的强大功能。它简化了Java应用的验证逻辑,提高了代码的可读性和可...
11. **性能优化**:讨论Hibernate的性能问题,如过多的数据库查询、无效的缓存利用等,并提供相应的优化策略,如批处理、延迟加载等。 12. **实战案例**:通过实际的项目案例,演示如何在应用中集成Hibernate,实现...
Session是Hibernate的工作单元,用于执行数据库操作,如保存、更新、删除和查询对象。每个数据库连接对应一个Session实例,生命周期较短,一般在一个事务内使用并关闭。 【持久化对象】 在Hibernate中,Java对象被...
- 第二个`testSave()`方法试图在save()之前为对象赋ID,这在Hibernate中是无效的,因为ID由Hibernate自动管理。 - 第三个`testSave()`尝试在对象已经持久化后修改ID,这是不允许的,因为它违反了数据库的唯一性约束...