Hibernate------>第一个hibernate案例

本案例采用的软件和技术: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();

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值