消息关闭
    暂无新消息!
首先,初学都一名,在已经找了很多文章后,也参考了以下文章:
---[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



8个回答

︿ 3
看错误提示t_user.t_user  不存在
你的数据库名为t_user?你去mysql控制台查看下
是否存在该数据库。
︿ 2
你解决这个问题了吗,我也是这样只有语句没有表,不过我是把主键设为string类型的,配置文件中用的uuid
︿ 2
这个有哪位前辈解决过吗?
自己在进行建表时,总会有点问题不一致。
想在hibernate运行时自动生成来解决这个生成表的过程。
︿ 0
你的mysql版本是多少?
另建议在mysql可视化工具Navicat中去执行下你的建表语句
看下是什么情况
︿ 0
我看你的mysql存储用的是myisam类型。
建议你把方言换成
org.hibernate.dialect.MySQLMyISAMDialect 
︿ 0
还要沉下去了,有没有高手可以帮忙解决一下我的问题哦,不能生成表哦。
︿ 0
解决了,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