本案例采用的软件和技术:Myeclipse+mysql+Hibernate
1.Hibernate概念:
1.1Hibernate是关系型数据库和java的一个桥梁,它既不像JDBC般纯java语言,对代码的侵入式强,它是一种温软的ORM(对象数据库映射)框架,它的低侵入式在于Hibernate完全采用java对象的javabean(标准的pojo),不必实现接口和抽象.
1.2Hibernate的默认配置文件为hibernate.cfg.xml(必须是这个)否则会报以下这个错误../hibernate.cfg.xml not found(找不到hibernate配置文件)
为什么这么霸道一定要这个名字了??因为,当调用configuration对象的configure()方法时,Hibernate将自动加载hibernate.cfg.xml
好!废话不多说,接下来完成我们的案例!
二 hibernate环境:
这里的jar包就可以了! 听说jar包不能多,否则会出现不知名的错误..
三 Hibernate代码
3.1设置一个标准JOPO(javabean)
public class bean {
private int id;
private String name;
private String address;
public bean(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
POJO最好加上一个无参构造......
3.2对应的数据库代码
要注意的数据库中的表必须有主键,必须有主键,必须有主键(主要的话打三次),否则会报:2.The database returned no natively generated identity value(最后我会和你总结一下我出错的地方,然后总结方法,在文章的最后面)
3.3接下来,设置配置文件,或许你会问,复杂的配置文件在哪里找啊,难道手打?不用的,粘贴复制嘛,如果你嫌麻烦你也可以到我的博客里找代码也是可以的啊!!
hibernate.cfg.xml代码: 在hibernate-distribution-3.6.0.Final包里的------>project包------>etc------>hibernate.cfg.xml
hibernate.hbm.xml代码: 也在hibernate-distribution-3.6.0.Final包里,打开该包直接在搜索框里搜索*.hbm.xml就可以了
3.4hibernate.cfg.xml配置文件
<!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>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///test_table</property>
<property name="connection.username">root</property>
<property name="connection.password">samlin123</property>
<!-- 以下两个代表:是否要打印出sql输入格式和过程 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 按ctrl+shift就可以按出open type,再输入mysqldialect就可以得到mysql的方言类 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 自动创表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 匹配hibernate的第二个配置(类配置) -->
<mapping resource="hibernate_test/bean.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.5***.hbm.xml配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hibernate_test">
<class name="bean" table="NBA">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
3.6运行类
package hibernate_test;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class test {
public static void main(String[] args) {
//1.首先设置javabean里面的值
bean b=new bean();
b.setName("哈登");
b.setAddress("美国休斯敦");
//2.获取configuration
Configuration con=new Configuration().configure();
//3.获取sessionfactory
SessionFactory sf = con.buildSessionFactory();
//4.获取session,打开事务
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//5.用面向对象的方式操作数据库
session.save(b);
tx.commit();
//6.关闭事务,关闭session
session.close();
}
}
此处需要注意的是
当
bean bean = new bean();
bean.setPlayer("麦迪");
bean.setPlayer("哈登");
bean.setPlayer("戴维斯");
bean实体类储存了多个对象,那么它只会输出最后的哪一个出来,因为该操作是单操作,非批量操作
另外,当你的数据库没有设置主键时,那么使用hinerbate 时 它会报这种错 The database returned no natively generated identity value
因为hibernate操作当中必须有主键id 因为在*.hbm.xml 当中 id是必填的项目
该运行类步骤:
1.首先设置javabean里面的值
2.获取configuration
3.获取sessionfactory
4.获取session,打开事务
5.用面向对象的方式操作数据库
6.关闭事务
7.关闭session
运行结果:
在数据库中的变现
我的第一个hibernate所遇到的问题
1.首要问题是jar包问题
2.配置问题
3.路径问题
如下问题及解决方案
1.Field 'bid' doesn't have a default value;
出现1错误的原因:是因为数据库字段和javabean中的类没有对应起来
2.The database returned no natively generated identity value
出现2的原因是因为数据库里该字段不是自动增加的,而你将该字段对应的属性变为主键,就会报错
3.MySQL 错误:there can be only one auto column and it must be defined as a key
---------------->解决:将该字段变成主键;然后再加上auto_increament.
4.我把配置中hibernate类配置删除了主键字段后又重新添加一模一样的字段,结果报错,因为它将你视为连续添加了两个不同的主键..
解决:--->将该表drop掉,重新创建一个拥有主键的又自动的表
5.hibernate.hbm2ddl.auto的值
create:表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
6.Unknown entity: hibernate_test.bean异常
解决:报org.hibernate.MappingException: Unknown entity,可能是没有在cfg文件中加入 *.hbm.xml造成的
7.resource: bean.hbm.xml not found
这个hibernate在src包下的所以,当你把bean.hbm.xml放到src子包里的时候,在hibernate.cfg.xml配置里就要写上绝对路径!(src下的包名加配置文件名 注:不含src)
8.上面图红圈标注的地方, 我总是写成类名,这里是包名!
*.hbm.xml要和pojo类文件同名!!!!!
今天又学到另外一种编写hibernate方式的代码
public static void main(String[] args) throws Exception{
// 1. 加载默认的hibernate.cfg.xml的配置文件
Configuration config = new Configuration().configure();
// 2. 加载hbm文件 (Test.hbm.xml)
config.addClass(cn.itcast.hibernate.api.Test.class);
// 3. 根据配置生成表
SchemaExport schema = new SchemaExport(config);
schema.create(true, true);
// 4. 构建SessionFactory对象
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession(); // 5. 建立连接
Transaction tran = session.beginTransaction(); // 6. 开启事务
Test t = new Test();
t.setName("test hibbernate");
session.save(t);
tran.commit(); // 7. 提交事务
session.close(); // 8. 关闭会话
}
//下面这种方法是一个小型sessionfactroy工具
private static SessionFactory sf;
static {
sf = new Configuration()
.configure()
.addClass(Dept.class)
.addClass(Employee.class) // 测试时候使用
.buildSessionFactory();
}