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
在多对多的时候:在一端放弃维护关系,在另一端配置中间表,配置上本身和另外表的外键

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。