hibernate不自动建表及报错信息记录

本文解决了使用Hibernate在MySQL中自动生成表时遇到的问题,包括主键类型不匹配导致的表无法创建,以及通过更换依赖从persistence-api到hibernate-jpa-2.1-api来解决主键生成策略的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用的jar及代码如下:
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
</dependency>
@GeneratedValue
@Column(name = "id", length = 22)
private String id;
报错信息:
Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
	at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:973)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:824)
有人说是Hibernate4.3的一个bug 将Table(name="t_user")改为这个@Entity(name="t_user")就不报错了.参考:http://blog.youkuaiyun.com/chaoowang/article/details/21233347
按上面的试验之后还是不能自动建表
随后,将
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
</dependency>
改为
<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
</dependency>
后再试,保存时报错为:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'school.t_foo' doesn't exist
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
为什么一直没有创建表呢,自己创建一个表试试,
此时报错信息变为了:
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
 
 
折腾了一会儿突然想到,Hibernate配置为@GeneratedValue时采用的是默认策略,生成的主键类型是Integer而不是String.
然后将String改为了Integer类型可以正常生成表了.
接下来改为UUID生成策略后主键改回String,一切终于正常了.
总结一下:
1.hibernate对于mysql生成主键的策略是Interger类型,如果主键的类型不匹配则不会自动建表.
2.javax.persistence:persistence-api对于hibernate生成主键不支持,需要修改为hibernate-jpa-2.1-api

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值