Hibernate操做数据库问题总结

一、没法实例化问题
检查一下数据库是否正常链接。我使用的是IDEA,能够用它直接链接数据库试试,若是它都链接失败了,那确定出问题。java


二、空指针问题
运行后报空指针的错误,后来打断点发现就是在session处出问题,后来检查各类注解,把
@Autowired
public SessionFactory sessionFactory;
public Session getCurrentSession() {
return this.sessionFactory.openSession();}

单独写在一个dao层的类里面,别的类继承这个类便可。把数据库操做语句改为hql,我原来使用的是原生sql语句,最后不报错了,至因而哪一点引发的错误还须要后续慢慢找缘由。web


三、运行没有报错,可是除了“添加”,别的数据库操做都没有起做用
在网上搜了一下,说是事务方面出了问题,原来的代码以下:sql

@Transactional(readOnly = false)
    public void editCard(UpdateCardBo b){
        Session session=getCurrentSession();
        session.update(b);
    }

我猜测是注解出了问题,本身写事务后以下:数据库

public void editCard(UpdateCardBo b){
        Session session=getCurrentSession();
        Transaction tx = null;
        tx = session.beginTransaction();
        session.update(b);
        tx.commit();
        session.close();
    }

运行后数据库被正常操做。至于注解为何没起做用,应该是配置文件的问题。session


四、找不到xxx类型的bean
这里写图片描述
网上说这个不会影响程序运行,可是我运行时候会报错,没有办法,只能本身new一个对象了。不知道是否是配置文件出了问题,可是同一个类里面的别的@Autowired 注解都没问题。
五、总结ide

  • 逻辑必定要清晰,操做一个数据库,用一个 SessionFactory 就好了,而每操做一次数据库都须要一个Session,新建Session的方式是sessionFactory.openSession() 每调用一次openSession() 都会新建一个Session。svg

  • 更新和删除操做须要获取特定的行,获取特定的行People p = (People) session.get(People.class, id); //id为主键有些写法是在dao层里写更新和删除方法时传入id参数,可是这种写法缺少灵活性,对删除操做没有影响,可是对于更新操做:ui

private void updatePeople(String name,int id){
      Session session = factory.openSession();
      Transaction tx = null;
      tx = session.beginTransaction();
      //id为表的主键
      People p = (People) session.get(People.class, id);
      p.setName(name);
      session.update(p);
      tx.commit();
      session.close();
 }

这种写法会把要更新的属性固定,若是要更新别的字段,就必须写别的更新操做。比较实用的方法是在Service层增长一个新的方法:this

@Override
    public UpdateCardBo getId(int id){
        return (UpdateCardBo)up.getCurrentSession().get(UpdateCardBo.class,id);
    }

使用这个方法能够返回特定 id 的记录信息,在Controller层使用实例以下:spa

UpdateCardBo b=updateCardServiceImpl.getId(1);//updateCardServiceImpl是Service实例
        b.setName("yyyyyyy");
        b.setUsername("ggggg");
        b.setCertUuid("11111111111111111");
        b.setIdcard("2222222222222222222222");
        updateCardServiceImpl.editCard(b);

能够对不一样字段进行更新。

  • 不少问题没有找出来出错缘由,后续还要再想一想,可是代码规范之后问题就没了,经过不断的探索能让程序正常运行,最起码知道怎么作是对的了,也算是进步吧。