zoukankan      html  css  js  c++  java
  • hibernate小记

    要是返回list,但是不是一个完整的对象的时候,用list来接收
    再进行循环,讲object转换为object[]

    configuration cfg = new Configuration().configure();
    serviceRegisty sr = new ServiceRegiseryBuilder().
    applySerttings(cfg.getProperties()).buildServiceRegistry();

    sessionfactory factory = cfg.buildSessionFaceory(sr);

    Session session = factory.getCurrentSesion();
    session.beginTransaction();

    //...code

    session.getTransacion.commit();

    //code部分

    //保存一个对象
    session.save(user);

    //根据主键查找对象
    session.get(User.class,1);

    //修改对象
    User user = session.get(User.class,1);
    现在user是持久态
    user.setUserName("tom");

    //删除对象
    User user = session.get(User.class,1);

    //查询所有
    Query query = session.createQuery("from User");
    List list = query.findAll();

    //在查询单个对象的时候有get和load
    //如果找不到对象load会出现异常。。get则不会出现异常。。而且load是有延迟加载的

    //save和persist都是讲持久化对象保存到数据库中的。
    //save方法是将自由态的对象保存
    //update方法将游离态的对象进行保存,将持久态进行更新
    //saveOrUpdate将自有态进行保存,将持久态和游离态进行保存
    //如果持久化对象在数据库中存在,使用merge操作时进行同步操作。如果对象在数据库不存在,merge对象则进
    行保存操作,使用meger不会改变对象的状态。

    HQL占位符
    //给?进行赋值
    string hql = "from User where userName = ?";;
    Query query = session.createQuery(hql);
    query.setString(0,"test");

    //HQL引用占位符
    string hql = "from User where userName = :name";
    query.setParameter("name","test");

    //HQL分页
    query.setFirstResult(0);
    query.setMaxResult(2);

    criteria查询...其中有查询restrictions(条件)、projections(聚合函数)
    //查询所有
    criteria c = session.createCriteria(User.class);
    list<User> list = c.list();

    //where查询
    c.add(Restrictions.eq("userName","test"));
    restrictions.gt >
    restrictions.lt <
    ge >=
    le <=
    between 在什么中间
    in
    and
    or
    like

    可以这样执行:
    c.add(Restrictions.or(Restrictions.eq("userName", "James"),
    Restrictions.eq("userName", "Alex")));
    两个条件进行or操作。


    //获取到唯一记录
    c.uniqueResult();

    //分组和统计,聚合函数
    c.setProjection(Projections.sum("id"));
    Projections.sum() sum()
    Projections.avg() avg()平均数
    Projections.count() count()
    projections.distinct() 去除重复数据
    projections.max()
    projections.min()
    projections.groupProperty 分组查询


    //多个统计与分组
    projectionList projectlist = Projects.projectionList();
    projectlist.add(prjections.sum("id"))
    projectlist.add(Project.min("id"))
    c.setProection(projectionlist)
    有多个分组统计的时候,利用Object[]来进行接收


    //排序
    c.addOrder(Order.desc("id"));

    //使用原生sql查询
    String sql= "select id,username,userpwdfrom t_user";
    List list = session.createSQLQuery(sql).list();


    String sql= "select id,username,userpwdfrom t_userwhere id = 2";
    SQLQueryquery = session.createSQLQuery(sql).addEntity(User.class);//将几个参数的封装成一个实体类
    User user = (User) query.uniqueResult()


    //hibernate的配置
    fetch="join"抓取策略了,配置了这个的话,该列在外建查询的时候会把这个对象给查询出来
    cascade="delete"级联删除,在set中进行配置,当删除这条数据的时候,相关的外键约束数据也是被删除掉。
    inverse="true"放弃关系维护,在set中使用,一般使one的一方放弃维护关系

    //注解hibernate的配置
    放弃关系维护:oneToMany(mappedBy="user");其中user是另一个实体类的属性名
    抓取策略:fetch=FetchType.EAGER//在一端一般是用LAZY
    级联删除:cascade={CascadeType.REMOVE}//一般在一端进行配置

    缓存一下对象,防止session过期了获取不到了。Hibernate.initialize(u.getAddressSet());


    //一对多配置
    User
    一:@oneToMany(mappedBy="user")//其中user是实体类中的属性名
    Address
    多:@ManyToOne
    @joinColumn(name="user_id");其中user_id是在表address中的外键

    //多对多配置
    Student.java
    @ManyToMany(mappedBy="students")//students是另外一端配置的属性名

    Teacher.java
    @ManyToMany
    @JoinTable(name="t_student_teacher",
    joinColumns=@JoinColumn(name="studentid"),
    inverseJoinColumns=@JoinColumn(name="teacherid"))
    publicSet<Student> getStudents() {
    //t_student_teacher是中间表
    //本身类在中间表的外键studentid
    //另外一个类在中间表的外键teacherid

    总结:
    在一对多的时候:在一的一端配置oneToMany,并且放弃维护关系,一般还加上LAZY
    在多对多的时候:在一端放弃维护关系,在另一端配置中间表,配置上本身和另外表的外键

  • 相关阅读:
    jboss服务器下的中文乱码问题
    rpm数据库被损坏修复方案
    python http post简单例子
    python 获取时间戳相关计算
    Qt 之Excel 操作(二 强化版本)
    SqlServer查询某重复列根据条件取一条数据
    查看各表所占空间
    Taro 1.3.x版本 编译时报错 UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open 'util'
    React index.html引入script时 src中的斜杠都变成了空格,并且还多出了script标签 导致无法加载
    支付宝小程序 iOS报页面访问受限aboud:srcdoc android无此问题 2021记录
  • 原文地址:https://www.cnblogs.com/fucktom/p/4373389.html
Copyright © 2011-2022 走看看