Just some sharing about java open source and life
  • Hibernate one-to-many association

    日期:2009-05-19 12:09 | 作者:JavaChen | 分类目录:Hibernate
    88 views

    one-to-many单向关联:
    Company类:维护关系

    public class Company implements Serializable{
    private Integer cid;
    private String cname;
    
    private String address;
    private Set employees=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);
    }
    }
    

    Read More »

    作者:JavaChen | 分类目录:Hibernate | 标签:
  • Hibernate one-to-one association

    日期:2009-05-19 04:07 | 作者:JavaChen | 分类目录:Hibernate
    91 views

    one-to-one关系的现实模型: 现代社会的一夫一妻制度就是典型的one-to-one关系模型。
    在数据库设计里,one-to-one模型可以用2种方法来实现。
    1,主键关联:这时候要保证2个表的主键具有完全相同的值。
    2,外键关联:其中一个表使用外键关联另一个表。
    在表关联的设计中,不论是一对多还是多对一,都要将关联字段设置在多的那一方。
    单向关联:
    单向关联只有一方维护关系,one-to-one或 many-to-many 只在一方声明
    1.基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束:fk+unique。
    Read More »

    作者:JavaChen | 分类目录:Hibernate | 标签:
  • 利于ThreadLocal管理Hibernate 中的Session

    日期:2009-05-17 13:43 | 作者:JavaChen | 分类目录:Hibernate
    105 views

    我们知道Session是由SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个SessionFactory并从中获取Session实例,那么Session是否是线程安全的呢?很遗憾,答案是否定的。
    session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱。
    为了解决这个问题,java.lang.ThreadLocal给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢?其实 ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
    Read More »

    作者:JavaChen | 分类目录:Hibernate | 标签:
  • Hibernate 开发步骤

    日期:2009-05-17 02:37 | 作者:JavaChen | 分类目录:Hibernate
    137 views

    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.jar

    4.开发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();

    作者:JavaChen | 分类目录:Hibernate | 标签:
回到顶部

无觅相关文章插件,快速提升流量