dynamic-insert="true" 如果插入的值不为空 他才会把他列入插入语句中 (作用:节约资源)
<hibernate-mapping package="mypack"> <class>元素中定义的类来自mypack包
<property name="sex" access="field"/> 不会直接调用age的set,get方法. 避免get,set方法里的逻辑值.
<class name="xxx.xxx" table="xxxx" select-before-update=true> 如果设置成true 如果不经常修改java 对象的属性 就设为true 当对象没有被修改的时候 他不会执行update 语句 select-before-update=true 可以避免update 盲目的触发一个触发器
saveOrUpdate 如果是临时对象就用save 如果是游离对象才建议用saveOrUpdate 如果传递进来的是持久化状态 就直接返回
他会自动判断是游离状态还是临时状态 如果oid=null version=null等.那就是临时状态.
hibernate与触发器 协同工作 .. 假如save 一个数据 会触发一个触发器 那就会导致 session缓存的内容和数据库的内容不协调(不一样)
解决方法 : 在save后 调用flush()清除缓存 然后调用refresh() 重新到数据库当中加载刚才被保存的xxxx对象
select-before-update=true 可以避免update 盲目的触发一个触发器
<set batch-size="3"> 批量查询 3句查询语句 一起初始化..
映射 一对多的关联
(
需要在 xxx.hbm.xml里添加
<many-to-one
name="customer" //用户表的实例
columb="CUSTOMER_ID"
class="mypack.Customer"
cascade="save-update" 保存或者更新customer的临时对象
not-null="true"
/>
//建立用户表和订单表外键的映射
)
//例子在HibernateDemo16:
映射一对多双向自身关系
//创建食物类.对象
Categories foodCategory=new Categories(null,"food",new HashSet());
//创建水果类.对象
Categories fruitCategory=new Categories(null,"fruit",new HashSet());
//创建蔬菜类 对象
Categories vegetableCategory=new Categories(null,"vegetable",new HashSet());
//创建苹果 对象
Categories appleCategory=new Categories(null,"apple",new HashSet());
//创建橘子对象
Categories orangeCategory=new Categories(null,"Orange",new HashSet());
//创建西红柿 对象
Categories tomatoCategory=new Categories(null,"tomato",new HashSet());
//建立食物类.和水果类的关系
foodCategory.getCategorieses().add(fruitCategory);
fruitCategory.setCategories(foodCategory);
//建立食物跟蔬菜关系
foodCategory.getCategorieses().add(vegetableCategory);
vegetableCategory.setCategories(foodCategory);
//建立水果和苹果的关系
fruitCategory.getCategorieses().add(appleCategory);
appleCategory.setCategories(fruitCategory);
//建立水果和橘子的关系
fruitCategory.getCategorieses().add(orangeCategory);
orangeCategory.setCategories(fruitCategory);
//建立西红柿跟水果的关系
fruitCategory.getCategorieses().add(tomatoCategory);
tomatoCategory.setCategories(fruitCategory);
//建立蔬菜和西红柿的关系
tomatoCategory.setCategories(vegetableCategory);
vegetableCategory.getCategorieses().add(tomatoCategory);
fruitCategory.getCategorieses().remove(tomatoCategory);
Session session=HBF.getSession();
session.save(foodCategory);
session.beginTransaction().commit();
session.close();
//例子在HibernateDemo14:
//双向修改
Pp pp1=new Pp();
pp1.setPname("aaaaaa");
pp1.setCid(new Long(27));
Catelog cla=new Catelog();
cla.setCname("bbbbb");
cla.setId(new Long(16));
pp1.setCatelog(cla);
//单项修改
// Catelog cla=new Catelog();
// cla.setCname("1111111111");
// cla.setId(new Long(16));
// dao.session.saveOrUpdate(cla);
CPDAO dao=new CPDAO();
dao.session.update(pp1);
dao.session.beginTransaction().commit();
dao.closeSession();
//例子在HibernateDemo14:
查询:
String sql="from Catelog c where c.id=2";
Query q=dao.session.createQuery(sql);
Catelog cla= (Catelog)q.uniqueResult();
Set<Pp> set= cla.getPps();
Iterator<Pp> it = set.iterator();
while(it.hasNext())
{
Pp p=it.next();
System.out.println(p.getPname()+" "+p.getCid());
}
//例子在HibernateDemo14:
//从表查询
String sql="from Pp p where p.catelog.id=16";
Query q=dao.session.createQuery(sql);
List<Pp> list = q.list();
for(Iterator<Pp> it = list.iterator();it.hasNext();)
{
Pp p=it.next();
System.out.println(p.getCatelog().getCname()+" "+p.getPname());
}
dao.session.close();
}
HQL 查询
public List QueryName(String name)
{
return session.createQuery("from Ord as c where Ord_number=:sname")
.setString("sname",name).list();
}
然后 List list=dao.QueryName("b");
QBC 查询
//创建一个Criteria 对象 然后把Ord 加载进去
Criteria criteria=dao.session.createCriteria(Ord.class);
Criterion criterion1=Expression.like("ord_number","T%");
criteria.add(criterion1);
List result=criteria.list();
QBE 查询
Ord entity=new Ord();
entity.setOrdNumber("Linda_Ord001");
Criteria criteria=dao.session.createCriteria(Ord.class);
Criterion criterion=Example.create(entity);
criteria.add(criterion);
List result=criteria.list();
HQL 排序
Query q=dao.session.createQuery("from Ord as o order by ord_number");