hibernate不自动生成数据表 ,运行console中显示已经执行语句了,但是没自动建表?

saimer1220 2017-06-03 07:47:30
首先,初学都一名,在已经找了很多文章后,也参考了以下文章:
---[eclipse中String无法设置为自动递增:]
http://bbs.csdn.net/topics/370036492
我的主键是int,所以应该没这个问题

---[eclipse下配置Hibernate5.2.7]
http://blog.csdn.net/Leafage_M/article/details/55106536?locationNum=4&fps=1
Hibernate Tools不是必要装的吧?(试着下载,但不成功,所以没用上HibernateTools)
在核心配置文件中进行下面的修改了没起到作用:
原来:
<property name="hibernate.hbm2ddl.auto" >update</property>
改成:
<property name="hbm2ddl.auto" >update</property>
或者改成:
<property name="hibernate.hbm2ddl.auto" >create</property>

---运行环境的配置都是OK的。


新建的是普通项目(JAVA Project)
其它的都是自己敲的,在[HibernateDemo01]中进行JUnit测试,不会自动生成表,而是JUnit报错了(JUnit错误写在最下面)。
但是在Console中,显示已经执行了sql语句了。
想问一下各位有没解决方法。

--------------------------------下面将代码写上---------------------------------------------
[cn.itcast.hibernate.User.java]文件

package cn.itcast.hibernate;
public class User {

/*hibernate要求实体类有一个属性唯一的*/
private int uid;
private String username;
private String password;
private String address;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}


[cn.itcast.hibernate.User.hbm.xml]文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1配置类和表对应 -->
<class name="cn.itcast.hibernate.User" table="t_user">
<!-- 2配置实体类id和数据库id对应 -->
<!-- id标签 -->
<id name="uid" column="uid">
<!-- 设置id数据增长策略
-->
<generator class="native"></generator>
</id>
<!-- 配置实体类中的其它属性与数据库对应 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>


[hibernate.cfg.xml]文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- 1.配置数据库信息 必须的 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///t_user</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1111</property>

<!-- 2.配置hibernare信息 可选的 -->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表,需要配置之后再用
update:如果已经有表,就更新;没有表,就创建表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言
在 mysql里面实现分页 关键字形limit,只能使用mysql里面的关键字
在oracle数据库里面,实现分页rownum
让hibernate框架识别不同数据库的自己特有的语句
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 3.把映射文件配置到核心文件中 -->
<mapping resource="cn/itcast/hibernate/User.hbm.xml"/>

</session-factory>
</hibernate-configuration>


[HibernateDemo01.java]文件

package cn.itcast.hibernateTest;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.itcast.hibernate.User;
import cn.itcast.utils.HibernateUtils;

public class HibernateDemo01 {

@Test
public void testAdd(){
//1.加载hibernate核心配置文件
//自动到src目录下找到名称是hibernate.hbm.xml文件

Configuration cfg = new Configuration();
cfg.configure();

//2.创建SessionFaction对象
SessionFactory sessionFactory = cfg.buildSessionFactory();

//3.使用SessionFaction创建Session对象
//类似于连接
Session session = sessionFactory.openSession();

//4.开启事务
Transaction tx = session.beginTransaction();

//5.进行CRUD操作
//进行添加功能操作
User user = new User();
user.setUsername("明明");
user.setPassword("123456");
user.setAddress("北方");
session.save(user); //将数据保存到session中

//6.提交事务
tx.commit();
//7.关闭资源
//根据后打开先关闭
session.close();
sessionFactory.close();
}
}


运行后的Console


JUnit中显示的错误信息:
(怕看不清,就只抓了几句重要的)
1.org.hibernate.exception.SQLGrammarException: could not execute statement
……
50.at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
51.at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
52.Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 't_user.t_user' doesn't exist
……
66.at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
67.at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
68.at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
69.at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
70.at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:205)
71.... 45 more


...全文
3382 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzu_huyk 2019-04-11
  • 打赏
  • 举报
回复
其实用<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 也可以,关键是方言中要加“5”,即要MySQL5InnoDBDialect,而MySQLInnoDBDialect会报错
fzu_huyk 2019-04-10
  • 打赏
  • 举报
回复
确实如23楼老兄所说的,改方言。官方给的三种方言没用,要复制上面给出的方言才可以。
kongyi188 2018-07-20
  • 打赏
  • 举报
回复
MySql 好像不支持自动增加标示。
Mr.姚先森 2018-05-27
  • 打赏
  • 举报
回复
方言修改为:org.hibernate.dialect.MySQL5Dialect解决
erniuerge 2017-09-21
  • 打赏
  • 举报
回复
如楼上所说,你改变配置方言为<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>。其实它输出的建表语句,就是把TYPE=MyISAM更改为 ENGINEE=MyISAM,两个方言配置的不同只是改变了type为engine.
qq_27443123 2017-09-10
  • 打赏
  • 举报
回复
就是方言的问题,我本来用的是MySQLInnoDBDialect,死活不建表,改为MySQL5Dialect一切安好
qq_16998383 2017-08-25
  • 打赏
  • 举报
回复
不知道你有没有解决,你可以把方言改为Mysql5Dialect试一下
regin@wrj 2017-08-23
  • 打赏
  • 举报
回复
@fantasy_Land 楼上大神,厉害啦。帮我结局了问题,感谢感谢
  • 打赏
  • 举报
回复
修改hibernate.cfg.xml中mysql的方言为:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
当使用的mysql的版本为5.5时,方言需要这样设置
saimer1220 2017-07-26
  • 打赏
  • 举报
回复
一个多月过去了,都没能解决,难道就这样关贴了?
nikyotensai 2017-06-26
  • 打赏
  • 举报
回复
itcast好眼熟
saimer1220 2017-06-26
  • 打赏
  • 举报
回复
我发现是在hibernate中单独执行sql语句时才会有这个问题出现。 是在hibernate执行的 "typ=MyISAM"执行的时候有问题。 有没办法让hiberante单独执行时将type="MyISAM" 改成 ENGINE = "MyISAM"?????
saimer1220 2017-06-20
  • 打赏
  • 举报
回复
引用 14 楼 su20145104009 的回复:
在hibernate.cfg.xml中加入这行代码试试:<property name="hibernate.current_session_context_class">thread</property>
试过了,但是还是一样没用。都是SQL语句执行了但是在数据库中不建表。
scx_white 2017-06-19
  • 打赏
  • 举报
回复
在hibernate.cfg.xml中加入这行代码试试:<property name="hibernate.current_session_context_class">thread</property>
saimer1220 2017-06-17
  • 打赏
  • 举报
回复
引用 12 楼 qq_16998383 的回复:
解决了,TYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 ,(老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。 MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。 一般地,ENGINE 选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。 所以直接将原来TYPE=MyISAM 改成ENGINE=MyISAM 就可以了 修改语句:ALTER TABLE `database` ENGINE = MYISAM
你这个要改的,是在哪里改?我用的是eclipse,没找到可以改sql语句中type=MyISAM的方法。
qq_16998383 2017-06-16
  • 打赏
  • 举报
回复
解决了,TYPE=MyISAM 和 ENGINE=MyISAM 都是设置数据库存储引擎的语句 ,(老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。 MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。 一般地,ENGINE 选项是不必要的;除非默认已经被改变了,MyISAM是默认存储引擎。 所以直接将原来TYPE=MyISAM 改成ENGINE=MyISAM 就可以了 修改语句:ALTER TABLE `database` ENGINE = MYISAM
qq_16998383 2017-06-16
  • 打赏
  • 举报
回复
你解决这个问题了吗,我也是这样只有语句没有表,不过我是把主键设为string类型的,配置文件中用的uuid
saimer1220 2017-06-13
  • 打赏
  • 举报
回复
还要沉下去了,有没有高手可以帮忙解决一下我的问题哦,不能生成表哦。
saimer1220 2017-06-09
  • 打赏
  • 举报
回复
引用 8 楼 zc881124 的回复:
你的mysql版本是多少?
另建议在mysql可视化工具Navicat中去执行下你的建表语句
看下是什么情况


我的mysql是5.5版本的,应该没问题吧。
也试了在Navicat下运行语句了,是可以生成表的。





想问一下,和type= MyISAM有没关系?可不可以将 hibernate必成用 type = Mysql这样的呢?
110成成 2017-06-09
  • 打赏
  • 举报
回复
你的mysql版本是多少? 另建议在mysql可视化工具Navicat中去执行下你的建表语句 看下是什么情况
加载更多回复(7)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧