您的位置:首页 > 其它

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

2016-01-31 20:42 375 查看
使用的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.csdn.net/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate