Hibernate不能自动建表

这是我第一天学习hibernate遇到的问题,纠结了一天终于解决了。

项目功能很简单,就是保存一条数据到数据库。我完全照着尚硅谷佟刚老师的hibernate4.0的视频写的,结果运行一直出现找不到表的问题。

先看JUnit的Failure Trace报的错

org.hibernate.exception.SQLGrammarException: could not execute statement
          at ......此处省略
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.news_table' doesn't exist
          at.......此处省略

我看到这个报错后就像,既然找不到表嘛我就新建一个嘛,我在test数据库下新建了一个news_table表,结果成功把数据添加进去了,而且我建的这个表只有部分字段,缺的字段它也补全了。原本我打算就此了事,结果往后的学习中我知道这表是自动生成的,而不是必须我手动在数据库新建。所以我开始寻求这个问题的答案。

这里我顺便引申一下吧,在bibernate.cfg.xml配置文件中的hibernate-configuration下的session-factory下添加<property name="hbm2ddl.auto">值</property>。值为以下四种
              create              每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
              create-drop :
              每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
              update              最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动 更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
              validate :
              每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
      我在网上搜了一下,遇到这个问题的人挺多的。有人回答说“把hibernate映射文件中的catalog=hibernate属性去掉”,结果我发现我没有,所以不可能是这个原因。有人回答说“看一下映射文件中的主键类型是不是java.lang.String,是的话改成java.lang.Integer”,我检查了一下,我是用的Integer。有人回答说是“<property name="hbm2ddl.auto">update</property>”的问题,于是我试了一下换成create,结果还是不行,而且我试了下手动新建,结果这次不仅值没插进去,反而给我把表删掉了。有人说我肯定是哪个字符串写错了,我检查了几遍都没问题。还有人说版本不对,所以我换了很多版本,用hibernate-core-5.0.0.Final.jar的时候还出现了个org.hibernate.MappingException: Unknown entity:,所以都不知道原问题解决没,其实应该是没解决。真心没法了。
     正当我准备放弃的时候,我在csdn上看到一篇文章,他提出了一个新的解决办法,虽然他说他不知道为什么。其实很简单,就是数据库方言设置有问题。
     Hibernate的底层仍然是用的SQL语句执行数据库操作,虽然所有的关系型数据库都支持SQL,但是不同的数据库都进行了扩展,在语法上存在一定差异,举例来说,我们在MySQL数据库里进行分页查询,只需使用limit关键字就可以了;而标准SQL并不支持limit关键字,例如Oracle则需要使用行内视图的方式来进行分页。所以Hibernate提供了指定数据库方言的办法。
使用<property name="dialect">方言</property>来设置方言,比如MySQL支持
1、org.hibernate.dialect.MySQLDialect;
2、org.hibernate.dialect.MySQLInnoDBDialect
3、org.hibernate.dialect.MySQLMyISAMDialect
     三种方言,这个可以在hibernate-release-x.x.x.Final/project/etc/hibernate.properties文件中查到。
     而我的错误在于照搬示例上用的org.hibernate.dialect.MySQLInnoDBDialect;方言。我改成org.hibernate.dialect.MySQLDialect;成功运行。方言的设定与数据库版本也有关系,大家试着弄一个适合的吧,有时候还会涉及到事务的
支持与冲突。大家慢慢研究吧,新手的我渴望大家能给我一些指正和扩展。谢谢!
		
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果 JPA 程序在启动时不能自动建表,有几个可能的原因和解决方法: 1. 检查配置文件:确保你的项目中的配置文件中启用了自动建表的选项。在 `application.properties` 或 `application.yml` 配置文件中,添加以下配置: - application.properties: ``` spring.jpa.hibernate.ddl-auto=create ``` - application.yml: ```yaml spring: jpa: hibernate: ddl-auto: create ``` 这会告诉 JPA 在启动时自动建表。如果你已经设置了这个属性但仍然无法自动建表,请检查其他配置是否正确。 2. 检查实体类注解:确保你的实体类上使用了 `@Entity` 注解,以标识该类为一个 JPA 实体。此外,还要检查实体类的属性注解是否正确,如 `@Id`、`@GeneratedValue`、`@Column` 等。 3. 检查数据库连接:确保你的数据库连接配置正确,并且应用程序能够成功连接到数据库。检查数据库的用户名、密码、数据库名称等配置是否正确。 4. 检查数据库驱动依赖:确保你的项目中包含了正确的数据库驱动依赖。根据你使用的数据库类型,添加相应的依赖到你的项目中。 例如,使用 MySQL 数据库时,需要添加以下 Maven 依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 如果你使用的是其他数据库,可以根据数据库类型添加相应的依赖。 5. 手动创建表:如果以上方法都无法解决问题,你可以考虑手动创建表。在 JPA 中,可以使用 `@Table` 注解来指定表名,并使用 `@Column` 注解来指定列属性。在数据库中手动创建表后,JPA 将根据实体类的注解与数据库表进行映射。 ```java @Entity @Table(name = "your_table_name") public class YourEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // other entity properties and annotations } ``` 这样配置后,JPA 将会将实体类与指定的数据库表进行映射。 如果你仍然无法解决问题,请提供更多的错误信息和配置细节,以便更好地帮助你解决问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值