Hibernate

Posted 妄想症T

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate相关的知识,希望对你有一定的参考价值。

hibernate在hibernate.cfg.xml中配置数据库驱动,url,账号密码等

 

hibernate是有3种状态的,分别是瞬时、持久、脱管。其中new className()时数据库中还没有对应记录,这个时候className对象的状态是瞬时。

通过session的save把该对象保存在了数据库中,该对象也和session产生了联系,此时的状态应该是持久的。

最后把session关闭了,这个对象在数据库中有了对应的数据,但是已经和session失去了联系,相当于脱离了管理,状态是脱管。

 

hibernate有两种面向对象的查询方法,分别是criteria和hql

 

hibernate有多对一,一对多,多对多的关系。例如Product和Category是多对一的关系,则应该在Product.hbm.xml文件中设置<many-to-one>,再在hibernate.cfg.xml中增加Category的映射。

 

 

public class CategoryDAOImpl implements zhongfucheng.dao.CategoryDao{

    @Override
    publicvoidaddCategory(Category category) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";
        try {
            queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Category findCategory(String id) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category WHERE id=?";

        try {
            Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));

            return category;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public List<Category> getAllCategory() {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category";

        try {
            List<Category> categories = (List<Category>) queryRunner.query(sql, new BeanListHandler(Category.class));

            return categories;
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }

    }
}

  要比较hibernate和传统的DBUtil的区别,就先看看传统方式是怎么进行crud的,如果是插入一个新的数据,则将对象的属性进行拆分,然后拼装成SQL语句。

  在进行查询时,则是将sql数据的属性拼装成javabean对象,其操作时十分繁琐的。但是如果使用hibernate则直接对对象进行操作。

 

 

 


假设在一个事务中做了两件事情,第一件事情执行成功但是第二件事情执行失败,则第一个事务执行也就不会生效,只有在表的类型是INNODB时才支持事务


hibernate支持级联操作,作为级联是指在数据库中多个表的对应关系,假设有一张教师信息表,表中的属性有教师的年龄手机号码家庭住址等信息,另一张表是老师和所带的班级之间的信息,一个班级对应一个老师,包括老师的手机号码,如果在表1 中改变老师张三的手机号码,如果设置了级联,则表二中张三的手机号码也会改变

 

以上是关于Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的HQL多表查询

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

Hibernate CriteriaQuery where - ManyToOne 字段

Hibernate + MySQL:如何为数据库和表设置编码 utf-8

hibernate在使用getCurrentSession时提示no session found for current thread

Java类型相互转换byte[]类型,blob类型