手动构造一个detacheed对象
并不是所有用户自定义的对象都是Transient 的,我们可以new一个对象,但是给它赋值的时候赋予数据库中真实存在的数据,而且这些数据中必须包含在数据库中真实存在的主键(要求主键在数据库中存在,别的一样也没有用),这样的对象就是detacheed对象
public void testUpdate1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//手动构造的detached状态的对象,为这个对象赋值以真实数据库中的数据,这样下面的update的操作是可以成功的。因为它所指的数据在数据库中真实存在
User user = new User();
user.setId("402880d01b9be8dc011b9be9b23d0001");
user.setName("德华");
session.update(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
上面的做法会导致修改后的数据中没有复制的参数变成null,所以一般不这样做,应该先从数据库中加载到需要修改的数据,然后再修改update
对前面学习到的东西做一个小总结
Junit3简介:
编写测试类xxxTest,需要继承TestCase
编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
public void testHello1() {}
最好单元测试的代码单独建立一个目录
了解Hibernate中CRUD操作
了解get和load的区别?
get不支持lazy,load支持lazy
采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常
transient状态的特征?
在数据库中没有与之匹配的数据
没有纳入session的管理
persistent状态的特征?
persistent状态的对象在数据库中有与之匹配的数据
纳入了session的管理
在清理缓存(脏数据检查)的时候,会和数据库同步
detached状态的特征?
在数据库中有与之匹配的数据
没有纳入session的管理
利用Hibernate实现分页
public void testQuery() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
//从第几条记录开始查询
query.setFirstResult(2);
//显示几条数据
query.setMaxResults(2);
List userList = query.list();
for (Iterator iter=userList.iterator(); iter.hasNext();) {
User user = (User)iter.next();
System.out.println(user.getId());
System.out.println(user.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
映射标签和属性介绍
实体类---表
实体类中的普通属性(不包括List)---表字段
采用<class>标签映射成数据库表,通过<property>标签将普通属性映射成表字段
所谓普通属性指不包括自定义类、集合和数组等
注意:如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名
实体类的设计原则:
实现一个默认的(即无参数的)构造方法(constructor)
提供一个标识属性(identifier property)(可选)
使用非final的类 (可选)
为持久化字段声明访问器(accessors)
主键生成策略:
uuid、native和assigned
其中uuid是由hibernate帮助我们生成的,这种策略生成的主键可以不用连接数据库,用这种策略产生主键的对象在save的时候不会发sql。
Native则是由数据库帮助生成的,在save的时候一定要发sql。否则无法获得这个对象的主键值。
我们每次重新生成数据库表的时候,系统默认都会把数据库中所有的表删除重建,这样容易造成已经建立好的表中的数据的丢失,我们希望在执行的时候只重建修改的表,对已经存在的没修改的表不进行处理。就需要在hibernate.cfg.xml中加上下面的属性配置
<property name="hibernate.hbm2ddl.auto">update</property>
有了这条配置,每次系统生成数据库表,就只重新生成修改的表。
下面明确几个概念
1.persistent状态的对象是不能引用transient状态的对象的,因为transient对象没有被分配oid
2.uuid的生成是由hibernate帮助我们完成的。所以这种id策略,在事务中save的时候不会发上发sql,但是如果采用native就必须马上发sql,因为这个id是由数据库帮助生成的。
3.关联映射的本质:将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。
并不是所有用户自定义的对象都是Transient 的,我们可以new一个对象,但是给它赋值的时候赋予数据库中真实存在的数据,而且这些数据中必须包含在数据库中真实存在的主键(要求主键在数据库中存在,别的一样也没有用),这样的对象就是detacheed对象
public void testUpdate1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//手动构造的detached状态的对象,为这个对象赋值以真实数据库中的数据,这样下面的update的操作是可以成功的。因为它所指的数据在数据库中真实存在
User user = new User();
user.setId("402880d01b9be8dc011b9be9b23d0001");
user.setName("德华");
session.update(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
上面的做法会导致修改后的数据中没有复制的参数变成null,所以一般不这样做,应该先从数据库中加载到需要修改的数据,然后再修改update
对前面学习到的东西做一个小总结
Junit3简介:
编写测试类xxxTest,需要继承TestCase
编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
public void testHello1() {}
最好单元测试的代码单独建立一个目录
了解Hibernate中CRUD操作
了解get和load的区别?
get不支持lazy,load支持lazy
采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常
transient状态的特征?
在数据库中没有与之匹配的数据
没有纳入session的管理
persistent状态的特征?
persistent状态的对象在数据库中有与之匹配的数据
纳入了session的管理
在清理缓存(脏数据检查)的时候,会和数据库同步
detached状态的特征?
在数据库中有与之匹配的数据
没有纳入session的管理
利用Hibernate实现分页
public void testQuery() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Query query = session.createQuery("from User");
//从第几条记录开始查询
query.setFirstResult(2);
//显示几条数据
query.setMaxResults(2);
List userList = query.list();
for (Iterator iter=userList.iterator(); iter.hasNext();) {
User user = (User)iter.next();
System.out.println(user.getId());
System.out.println(user.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
映射标签和属性介绍
实体类---表
实体类中的普通属性(不包括List)---表字段
采用<class>标签映射成数据库表,通过<property>标签将普通属性映射成表字段
所谓普通属性指不包括自定义类、集合和数组等
注意:如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名
实体类的设计原则:
实现一个默认的(即无参数的)构造方法(constructor)
提供一个标识属性(identifier property)(可选)
使用非final的类 (可选)
为持久化字段声明访问器(accessors)
主键生成策略:
uuid、native和assigned
其中uuid是由hibernate帮助我们生成的,这种策略生成的主键可以不用连接数据库,用这种策略产生主键的对象在save的时候不会发sql。
Native则是由数据库帮助生成的,在save的时候一定要发sql。否则无法获得这个对象的主键值。
我们每次重新生成数据库表的时候,系统默认都会把数据库中所有的表删除重建,这样容易造成已经建立好的表中的数据的丢失,我们希望在执行的时候只重建修改的表,对已经存在的没修改的表不进行处理。就需要在hibernate.cfg.xml中加上下面的属性配置
<property name="hibernate.hbm2ddl.auto">update</property>
有了这条配置,每次系统生成数据库表,就只重新生成修改的表。
下面明确几个概念
1.persistent状态的对象是不能引用transient状态的对象的,因为transient对象没有被分配oid
2.uuid的生成是由hibernate帮助我们完成的。所以这种id策略,在事务中save的时候不会发上发sql,但是如果采用native就必须马上发sql,因为这个id是由数据库帮助生成的。
3.关联映射的本质:将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。