学了hibernate有两个礼拜了,还是有点模糊,主要是映射文件不太明白那位大侠能给俺讲讲映射文件?
1.实体类一对一主键关联如何配置?
2.实体类一对一外键关联如何配置?
3.单向多对一关联如何配置?
4.双向多对一关联呢?
5.懒加载的意义?怎样实现,怎样取消?
多讲讲里面参数的意思,跪求。

解决方案 »

  1.   

    建议你看看hibernate 自带的文档,里面写的很清楚,连例子都有。
      

  2.   

    去hibernate资料里看看,要一个一个的看,理解了一个再看下一个,最后再总结 结合看
      

  3.   

    尚学堂的视频里面也讲得很详细的
    http://www.bjsxt.com/load.asp?page=4
      

  4.   

    一对一 :
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.IdCard" table="t_idCard">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="cardNo"/>
    </class>
    </hibernate-mapping>
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.Person" table="t_person">
    <id name="id">
    <generator class="foreign">
    <param name="property">idCard</param>
    </generator>
    </id>
    <property name="name"/>
    <one-to-one name="idCard" constrained="true"/>
    </class>
    </hibernate-mapping>
      

  5.   

    上面是主键这个是外键:
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.IdCard" table="t_idCard">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="cardNo"/>
    <one-to-one name="person"/>
    </class>
    </hibernate-mapping>
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.Person" table="t_person">
    <id name="id">
    <generator class="foreign">
    <param name="property">idCard</param>
    </generator>
    </id>
    <property name="name"/>
    <one-to-one name="idCard" constrained="true"/>
    </class>
    </hibernate-mapping>
      

  6.   

    多对一:
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.User" table="t_user">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    <many-to-one name="group" column="groupid" cascade="all"/>
    </class>
    </hibernate-mapping>
    <hibernate-mapping>
    <class name="com.bjsxt.hibernate.Group" table="t_group">
    <id name="id">
    <generator class="native"/>
    </id>
    <property name="name"/>
    </class>
    </hibernate-mapping>
      

  7.   

    哦,你真幸福,学Hibernate还可以学两个礼拜。。说出来你可能不信,可却是真的,我们Hibernate老师用1个多小时就全部讲完了,至于你说的那什么印射,只要花
    两分钟就可以搞定,都是自动生成的东西,点点就好...话说Hibernate好像是ssha里最简单的东西,呵呵 
    1.实体类一对一主键关联如何配置? 
    2.实体类一对一外键关联如何配置? 
    3.单向多对一关联如何配置? 
    4.双向多对一关联呢? 
    这些不用你写都是自动生成的,而且很简单,都是在数据进行的操作,在Hibernate里印射时会把你在数据库里设置好的那些主外键关系全部自动写入文档里..
    在印射成的类里,主外键关系也会自动配好
    具体在数据库怎么操作,如果到明天晚上还没有答案,我会贴上来..一夜没睡了,睡一下,今天还有课呢..又是高效的脑力劳动啊,天天讲那么多知识...
    除非我们学的不一样,反正我连ssha集成的项目都做了,一个Hibernae实现调用应该没问题...
      

  8.   

    恩 同意楼上 一些东西确实是自动生成的  但我感觉最重要还是掌握原理
    基本原理都不懂 那谈什么应用啊 即使操作再简单 也只是会用而已
    但要想想为什么要用这个 不用可不可以  而且我认为hibernate在ssh框架里是学习内容最多的
    也是最重要的 要说最简单 呵呵 感觉struts简单些 但要掌握原理 还是要好好看看它的文档的
    或源代码 很有帮助的
    把基本的这些映射啊 hql啊 懒加载啊 等掌握差不多
    也要学学它的提高性能的一些东西 比如什么缓存 抓取策略 等等呵呵 我自己也是在学习之中 我们一起努力吧
      

  9.   

    无论是视频还是书籍
    对映射文件讲解的都很详细吧
    建议看看
    讲下lazy
    简单的说就是如果设置为false
    立即发sql语句,查询出来结果
    如果支持lazy,使用的时候再发sql语句
    然后lazy可以使用在
    * <class>标签上,可以取值:true/false(只对普通属性起作用)
    * <property>标签上,可以取值:true/false需要类增强工具
    * <set><list>标签上,可以取值:true/false/extra
    * <one-to-one><many-to-one>单端关联上,可以取值:false/proxy/noproxy
      

  10.   

    建议:不要再学用xml配置hibernate了(看着累不说,还容易出错),看看ejb3中的annotation(要jdk1.5以上),用它来代替xml配置

    @Entity
    public class A{
     
    @Id
    @TableGenerator(name = "A", table = "Map_Sequence")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "A")
            private Integer id;        @ManyToOne
            private B b;}
      

  11.   

    真是受不了,Hibernate什么时候变得这么深奥了..明明就是那么简单的东西..
    它不就是把数据库表作为对象印射了,然后再生成了一些dao方法
    在我看来它不就是自动生成了如entity和dao一样的存在吗,这样方便我们调用,而且大大减少了我们传统通过sql语句访问数据
    库而写的代码量..如果不是要进行特殊的复杂查寻,就那些印射而成的方法就够我们用的了..
    毫不夸张的说,如果不进行复杂查询,自己写hql,一个数据库的Hibernate印射文档的生成,都不要几分钟..实在方便,不管你跨多少个表,不管你表与表之间
    存在了多少的主,外键关系..还有那什么生成的那个hibernate的xml文档又不要自动动手写都是在数据库里建好关系直接印射过来的,有什么看不懂的.
    偏偏要把简单的东西复杂化:
    多对一:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="dao.TblJd" table="TBL_JD" schema="dbo" catalog="zf">
            <id name="jdid" type="java.lang.Integer">
                <column name="jdid" />
                <generator class="native"></generator>
            </id>
            <many-to-one name="tblQx" class="dao.TblQx" fetch="select">
                <column name="qxid" not-null="true" />
            </many-to-one>
            <property name="jd" type="java.lang.String">
                <column name="jd" length="50" />
            </property>
        </class>
    </hibernate-mapping>
    一对多:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="dao.TblQx" table="TBL_QX" schema="dbo" catalog="zf">
            <id name="qxid" type="java.lang.Integer">
                <column name="qxid" />
                <generator class="native"></generator>
            </id>
            <property name="qx" type="java.lang.String">
                <column name="qx" length="50" />
            </property>
            <set name="tblJds" inverse="true">
                <key>
                    <column name="qxid" not-null="true" />
                </key>
                <one-to-many class="dao.TblJd" />
            </set>
        </class>
    </hibernate-mapping>
    就这些,都是自动生成的xml文档,又不要写,就算有一天有些关系不在了,你也可以在这里面改改吗..想再添一些关系也可以仿照上面的关系写写.
    人的脑容量有多少呢,要学会变通..你理解了,代码当然是能少写就少写了,提高效率.
    一般你会做了,就差不多理解了..可是很多时候你理解了,却并不能操作出来
    不要告诉我,你们所有的hibernate的xml都是自己手写配置的..
      

  12.   

    xml配置和Annotation是各有好处的,不能说只去学Annotation啊。
      

  13.   

    尚学堂的Hibernate视频里就有这些例子第一个包里面...
    自去去下载.看看
    实体类一对一主键的配置 
    2.实体类一对一外键配置
    3.单向多对一关联单双向配置 
    4.双向多对一关联单双向
    都有,,王勇的..
      

  14.   


    自动生成??
    工具没了你找谁生成?
    公司以前的项目要你改也自动生成?
    有的关联不需要你也让系统自动生成?
    自己总归要去改改
    我用它自动生成的映射,做个登录,出来3条select语句,这样也行?
    难道不要确认下那些要,哪些不要么?
      

  15.   

      heibernate 配置文件详解
       <meta>元素的属性 属性 描述 
    class-description 指定描述类的javaDoc 
    field-description 指定描述类的属性javaDoc 
    interface 如果为true,表明生成接口而非类,默认false 
    implements 指定类所实现的接口 
    extends 指定继承的父类名 
    generated-class 重新指定生成的类名 
    scope-class 指定类的修饰符,默认public 
    scope-set 指定set方法的修饰符,默认public 
    scope-get 指定get方法的修饰符,默认public 
    scope-field 指定类的属性的修饰符,默认private 
    use-in-toString 如果为true,表示在toString()方法中包含此属性 
    gen-property 如果为false,不会在java类中生成此属性,默认true 
    finder-method 指定find方法名 
    <column>元素属性 
    name 设定字段名字 
    length 设定字段长度 
    not-null 如为true,指名该字段不允许为null,默认false 
    unique 如为true,指名该字段具有唯一约束,默认false 
    index 给一个或多个字段建立索引 
    unique-key 为多个字段设定唯一约束 
    foreign-key 为外键约束命名,在<many-to-many><one-to-one><key><many-to-one>元素中包含 
    foreign-key属性,在双向关联中,inverse属性为true的一端不能设置foreign-key 
    sql-type 设定字段sql类型 
    check 设定sql检查约束 
    用于控制insert or update 语句的映射属性 <property>元素的insert属性 如为false,在insert中不包含该字段,默认为true 
    <property>元素的update属性 如为false,在update中不包含该字段,默认为true 
    <class>元素的mutable属性 如为false,等价于所有字段的update属性为false,默认为true 
    <property>元素的dunameic-insert属性 如为true,表明动态生成insert语句,只有不为null,才会包含insert语句中,默认false 
    <property>元素的dunameic-update属性 如为true,表明动态生成update语句,只有不为null,才会包含insert语句中,默认false 
    <class>元素的dunameic-insert属性如为true,表明等价于所有字段动态生成insert语句,只有不为null,才会包含insert语句中 ,默认false 
    <class>元素的dunameic-update属性如为true,表明等价于所有字段动态生成update语句,只有不为null,才会包含insert语句中 ,默认false Hibernate提供的内置标识符生成器 
    increment 适用于代理主键,自动递增,增1(只能是long,int,short) 
    identity 适用于代理主键,底层数据库自动增长字段类型(数据库需支持,只能是long,int,short) 
    (oralce)sequence 适用于代理主键,根据底层数据库的序列来生成标识符(数据库支持序列,只能是long,int,short) 
    hilo 适用于代理主键,根据high/low算法来生成.Hibernate把特定表的字段作为high值,在默认情况下选用hibernate_unique_key表的next_hi字段 
    (mysql,mssql)native 适用于代理主键,根据数据库自动生成标识符支持能力,来选择identity,sequence,hilo 
    uuid.hex 适用于代理主键,采用128位UUID(universal unique identification)算法来生成标识.此算法能在网络环境中生成唯一的字符串标识符, 
    (不建议使用,字符串类型比整形类型的主键占用更多的空间) 
    assigned 适用于自然主键,由java程序负责生成. <hibernate-mapping> 
    <class name="项目路径" table="库中对应表名" schema="dbo" catalog="netoa"> 
    <meta attribute="class-description">指定描述类的javaDoc</meta> 
    <meta attribute="class-scope">指名类的修饰类型</meta> 
    <meta attribute="extends">指定继承类</meta> 
    <id name="bgrkbh" type="long"> 
    <column name="BGRKBH" precision="15" scale="0" sql-type="库中类型" check="BGRKBH>10"/> 
    <meta attribute="scope-set">指定类,类属性的getxxx(),setxxx()方法的修饰符 
    包括:static,final,abstract,public,protected,private 
    </meta> 
    <generator class="assigned" /> 
    </id> 
    <property name="Class.fileName" type="long"> 
    <column name="YSLX" precision="精度" scale="刻度" not-null="默认false" sql-type="数据库中类型"/> 
    附加属性不会影响Hibernate的运行行为 
    <meta attribute="field-description">指定描述类的javaDoc</meta> 
    指定描述类属性的javaDoc 
    </property> 
    </class> 
    </hibernate-mapping> 
    注意: 
    1 Session的commit()和flush()方法的区别,flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务; 
    commit()方法会先调用flush(),然后提交事务.提交事务意味着对数据库所作的更新被永久保存下来. 2 Session的setFlushMode()方法用于设定清理缓存的时间点.FlushMode类定义了三种不同的清理模式 清理缓存的模式 Session的查询方法 Session的commit()方法 Session的flush()方法 
    FlushMode.AUTO 清理 清理 清理 
    FlushMode.COMMIT 不清理 清理 清理 
    FlushMode.NEVER 不清理 不清理 清理 3 Hibernate应用中java对象的状态 
    临时状态 (transient):刚刚用new语句创建,还没被持久化,不处与Session的缓存中,处于临时状态的java对象被称为临时对象. 
    持久化状态(persistent):已经被持久化,加入session的缓存中.处于持久化状态的java对象被称为持久化对象. 
    游离状态(detached):已经被持久化,但不在处于session的缓存中.处于游离状态的java对象被称为游离对象. 
    (注意:::::)持久化类与持久化对象是不同的概念.持久化类的实例可以处于临时状态,持久化状态和游离状态.其中处于 
    持久化状态的实例 被称为持久化状态. 临时对象的特性: 
    1 不处于缓存中,也可以说,不被任何一个Session实例关联 
    2 在数据中没有对应的纪录. 在此情况下,java对象进入临时状态 
    1 当通过new创建一个对象时,此时不和数据库中的任何纪录的 ex:对象的状态转化过程 程序代码 对象的生命周期 对象的状态 
    tx=session.beginTransaction(); 
    Object obj=new Object("tow",new HashSet()); 开始生命周期 临时状态 session.save(obj); 处于生命周期 转化为持久状态 Long id=obj.getId(); 
    obj=null; 
    Object obj2=(Object)session.load(Object.class,id); 处于生命周期 处于持久化状态 
    tx.commit(); session.close(); 处于生命周期 转变成游离状态 System.out.print(obj2.getName()); 处于生命周期 处于游离状态 obj2=null; 结束生命周期 结束生命周期 
    4 cascade属性 cascade属性值 描述 
    none 在保存更新时,忽略其他关联对象,他是cascade默认属性 
    save-update 当通过Session的save(),update()以及saveOrUpdate()方法来保存 
    或更新当前对象时,及联保存所有关联的新建的临时对象,并且及联更新所有关联的游离对象 
    delete 当通过session的delete()方法删除当前对象时,及联删除所有对象 
    all 包含save-update及delete行为,此外对当前对象执行evict()或lock 
    ()操作时,也会对所有关联的持久化对象执行evict()或lock()操作 
    delete-orphan 删除所有和当前对象解除关联关系的对象 
    all-delete-orphan 包含all和delete-orphan 5 Hibernate映射类型,对应的java基本类型及对应的标准SQL类型 Hibernate 映射类型 java类型 标准SQL类型 
    integer或者int int INTEGER 
    long long BIGINT 
    short short SMALLINT 
    byte byte TINYINT 
    float float FLOAT 
    double double DOUBLE 
    big_decimal java.math.BigDecimal NUMERIC 
    character char and string CHAR 
    string string VARCHAR 
    boolean boolean BIT Hibernate映射类型,对应的java时间和日期类型及对应的标准SQL类型 映射类型 java类型 标准SQL类型 描述 
    date java.util.Date或者java.sql.Date DATE 代表日期,YYYY-MM-DD 
    time java.util.Date或者java.sql.Date TIME 代表时间,形式为HH:MM:SS 
    timestamp java.util.Date或者java.sql.Timestamp TIMESTAMP 代表日期和时间,YYYYMMDDHHMMSS 
    calendar java.util.Calendar TIMESTAMP 同上 
    calendar_date java.util.Calendar DATE 代表日期,YYYY-MM-DD 
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bolink5/archive/2009/05/25/4213844.aspx