-
Hibernate one-to-many association
one-to-many单向关联:
Company类:维护关系public class Company implements Serializable{ private Integer cid; private String cname; private String address; private Setemployees=new HashSet (); //.............. public void hire(Employee emp){ this.employees.add(emp); emp.setCompany(this); } public void fire(Employee e){ e.setCompany(null); this.employees.remove(e); } } 没有评论 -
Hibernate one-to-one association
one-to-one关系的现实模型: 现代社会的一夫一妻制度就是典型的one-to-one关系模型。
在数据库设计里,one-to-one模型可以用2种方法来实现。
1,主键关联:这时候要保证2个表的主键具有完全相同的值。
2,外键关联:其中一个表使用外键关联另一个表。
在表关联的设计中,不论是一对多还是多对一,都要将关联字段设置在多的那一方。
单向关联:
单向关联只有一方维护关系,one-to-one或 many-to-many 只在一方声明
1.基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束:fk+unique。
Read More » -
利于ThreadLocal管理Hibernate 中的Session
我们知道Session是由SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个SessionFactory并从中获取Session实例,那么Session是否是线程安全的呢?很遗憾,答案是否定的。
session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱。
为了解决这个问题,java.lang.ThreadLocal给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢?其实 ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
Read More » -
Hibernate 开发步骤
1.Object Relation Mapping
持久化类与关系表对应,持久化类实例与表中一行记录对应。
2.相关名词:
POJO(Plain Old Java Objects):实际就是普通JavaBeans,使用POJO名称是为了和EJB混淆起来, 而且简称比较直接.在Hibernate中代表包含Setter、Getter这些最基本操作的值对象。
BO:代表包含一些业务逻辑的值对象,它的作用域很大,也就是说BO在充当持久类的同时可以传到UI层。 PO代表持久对象,是纳入Hibernate管理框架中的,在一定程度上可以和值对象的概念互换,值对象经过Hibernate
进行处理,就变成了PO。
Hibernate配置文件:
hibernate.cfg.xml或 hibernate.properties,不过推荐使用XML格式。
映射文件*.hbm.xml:映射文件的作用是将POJO与关系型数据库数据相绑定,作为一个桥梁。
OID: Hibernate中用对象标识符OID来维持java对象和表中记录的对应关系,OID定义为整数类型(short、int、long),通常由Hibernate或通过底层数据库给OID赋值。
持久化类:被Hibernate持久化到数据库中,通过Setter和Getter方法,若为boolean型则可用is*方法。Hibernate不要求持久化类必须实现Serializable,但在分布式不同结点间传输持久化类必须实现Serializable接口
3.在开发Hibernate应用的时候需要预先把相应的JAR包配置到CLASS_PATH,我使用的是MyEclipse作为开发工具,主要的JAR大致如下:
—antlr.jar
—cglib.jar
—asm.jar
—asm-attrs.jar
—commons-collections.jar
—commons-logging.jar
—ehcache.jar
—hibernate3.jar
—jta.jar
—dom4j.jar
—log4j.jar4.开发Hibernate程序的步骤
开发Hibernate程序通常分为下面这几步:
1>、 建立JavaBean–> 每个JavaBean必须提供一个无参的构造函数,并为private属性提供get/set访问方法。如下:[code lang="Java"]
package com.kettas.hibernate.orm.m2m;
import java.util.HashSet;
import java.util.Set;
public class Student {
private Integer sid; //oid属性,用于与数据的表中主键相对应
private String sname; // syudent age sex 为业务属性
private int age;
private String sex;
private Set courses=new HashSet(); //关系属性,用于维护实体之间的关系public Student() { //提供一个默认的构造方法,便于hibernate底层使用发射机制
super();
}public Student(String sname, int age, String sex) {
this.sname = sname;
this.age = age;
this.sex = sex;
}public int getAge() {
return age;
}public void setAge(int age) {
this.age = age;
}public Set getCourses() {
return courses;
}public void setCourses(Set courses) {
this.courses = courses;
}public String getSex() {
return sex;
}public void setSex(String sex) {
this.sex = sex;
}public Integer getSid() {
return sid;
}public void setSid(Integer sid) {
this.sid = sid;
}public String getSname() {
return sname;
}public void setSname(String sname) {
this.sname = sname;
}
}[/code]
———-field和property的区别以及应注意事项——————-
区别:
field指用privat关键字修饰的变量sid,sname,age,sex,而private指的是setter和getter方法去掉set和get得到的将大写字母转换为小写的字母的变量。
注意:
(2)javabean中的setter和getter后面的名字一定要与field的值相对应 如 priavte String sname ,getSname(),setSname(),这点很重要,不然hibernate
读取配置文件会报错
(2)每个JavaBean必须提供一个无参的构造函数,并为private属性提供get/set访问方法。5.标准的配置文件
< ?xml version=”1.0″ encoding=”UTF-8″?>
< !DOCTYPE hibernate-configuration PUBLIC
“-//Hibernate/Hibernate Configuration DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”>thread
true true
org.hibernate.dialect.Oracle9Dialect
oracle.jdbc.driver.OracleDriver kettas kettas jdbc:oracle:thin:@192.168.0.200:1521:kettas
2 2 5000 100 3000 2 false
20 false
说明:
1.指明配置文件所在地方,在这里包结构用/连接不是用.
2.配置文件放在实体类所在位置,一般是放在entity包内与实体类在一起。——————–>映射文件:
< ?xml version=”1.0″?>
< !DOCTYPE hibernate-mapping PUBLIC
“-//Hibernate/Hibernate Mapping DTD 3.0//EN”
“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>czj_hibernate_student_seq
czj_hibernate_course_seq
映射文件说明:
Java database
calss(entity) table
object(persistent object) row
field column(oid—-k)
relation pk,fk
1> 标签用于指定哪一个类对应数据库中哪一个表
package属性用于指定本映射文件中包含类的包名为全局包,从而不必为每个类指定完整包名。
2> 标签用于指定java中oid对应于数据库中的哪一列
指定以哪种方式生成数据库中主键标识符
———–常见标识符生成器————————–
Hibernate中内置标识符生成器,均适合代理主键
increment:由Hibernate自增生成
identity:由底层数据库生成
sequence:底层数据库序列生成
hilo:根据high/low等算法生成以特定表字段作high值
native:自动选择identity、dequence、hilo
assgned:自然主键(尽量避免使用)
————————————————
3>说明: 标签指定java中的关系对应数据库中的表与表之间的关系
inverse属性: 为避免Hibernate在清理缓存时对相关联对象都执行更新操作,将inverse设置为true,将主控权交给many一方,以仅控mamy方状态更新对象。
不加默认为false,双方都不维护java类中的关系,运行会报错,此属性只用在one-to-many many-to-many中
cascade属性: 级联属性,当cascade属性设置为delete,在删除一对象时自动删除与其级联的对象,删除后持久化对象变为临时状态。
中column列值指的是Course类对应czj_hibernate_relation中的course_id这一列
指明Student这一类中的关系属性Set集合中Course类在java中与Student类的关系6。hiberante开发步骤
1>写实体层中的实体类
2>在数据库中建表
3>写配置文件和映射文件
4>写Dao层,在此层写hibernate应用程序
———————-hibernate应用程序步骤—————————
1>、创建配置(Configuration)
Configuration cfg = new Configuration().configure();
2>、构建会话工厂(SessionFactory)
SessionFactory = cfg.buildSessionFactory();
3>、打开会话(session)
Session session = sf.openSession();
4>、启动事务(Transaction)
Transaction ts = session.beginTransaction();
5>、持久化操作(CUQD)
session.save(*); *表示一个对象
session.update(*);
session.delete(*);
6>、提交事务(commit) ts.commit();
7>、事务回滚(rollback) ts.rollback();