hibernate映射文件详解:xxx.hbm.xml文件详解

一般一个映射文件对应于一个class,即对应于一张表。但是一个映射文件中可以有多个class

 

<hibernate-mapping package="cn.it.domain">

<!-- name)哪个类,如果在<hibernate-mapping package指定了包名,那么在class         中就不用指定包名,直接写User就行了,一般写出来

    (table)    对应于哪个表:这里可以不写,默认是类的简单名称

 

 -->

    <class name="User" table="t_user">

        <id name="id" column="id">

            <generator class="native"/>

        </id>

        <property name="name" column="name"/>

    </class>

   

</hibernate-mapping>

 

<hibernate-mapping package="cn.itcast.c_hbm_property">

   

    <!-- name属性:哪个类

         table属性:对应哪个表,如果不写,默认的表名就是类的简单名称

    -->

    <class name="User" table="t_user">

        <id name="id" type="int" column="id">

            <generator/>

        </id>

        <!-- 普通的属性(数据库中的基本类型,如字符串、日期、数字等)

            name属性:对象中的属性名,必须要有。

            type属性:类型,如果不写,Hibernate会自动检测。

                可以写Java中类的全名:java.lang.String

                或是写hibernate类型:string 小写,推荐使用

            column属性:对应表中的列名,如果没有,默认为属性名。

            length属性:长度,不是所有的类型都有长度属性,比如varchar有,但int没有,如果不写默认为255

            not-null属性:非空约束,默认为false

        -->

        <!--

        <property name="name"/>

         -->

        <property name="name" type="string" column="name" length="20" not-null="true"/>

 

        <property name="age" type="int" column="age_"/>

       

        <property name="birthday" type="date" column="birthday_"/>

       

        <!-- 当列表与关键字冲突时,可以通过column属性指定一个其他的列名。

            或是使用反引号包围起来,在键盘的波浪线下面:·· 建议不使用。

           

            指定使用text类型时,最好再指定length,以确定生成的SQL类型是能够存放指定数量的字符的。

           

        <property name="desc">

            <column name="desc_" length="5000" sql-type="text"/>

        </property>      

         -->

        <property name="desc" type="text" length="5000" column="`desc`" ></property>

        这里是两种方式:一种是将列名写成子元素,一种是将列名写成属性

        <!-- 头像,二进制类型,最好指定长度 -->

        <property name="photo" type="binary" length="102400"></property>

       

    </class>

   

</hibernate-mapping>

 

 

 

 

 

 

 

 

 

对于二进制文件的存取:

// 读取图片文件

        InputStream in = new FileInputStream( "c:/test.png");

        byte[] photo = new byte[in.available()];

        in.read(photo);

        in.close();

// 创建对象实例

        User user = new User();

        user.setName("张三");

        user.setAge(20);

        user.setBirthday(new Date());

        user.setDesc("一大段的说明,此处省略5000字……");

        user.setPhoto(photo);

这样之后将数据放在了数据库中

 

下面是从数据库中取出数据,写入到文件中:

public void testGet() throws Exception {

        Session session = sessionFactory.openSession();

        Transaction tx = session.beginTransaction();

 

        User user = (User) session.get(User.class, 4); // 获取

        System.out.println(user.getId());

        System.out.println(user.getName());

        System.out.println(user.getDesc());

        System.out.println(user.getPhoto());

       

        OutputStream out = new FileOutputStream("c:/copy.png");

        out.write(user.getPhoto());//用流关联,将数据写入到文件中

        out.close();

 

        tx.commit();

        session.close();

 

 

 

 

 

 

 

 

 

 

 

 

==============

主键:

    如果是数字,建议使用包装类型。

 

identity

sequence

hilo

native

assigned

uuid

foreign

...

 

<hibernate-mapping package="cn.itcast.d_hbm_id">

   

    <class name="User" table="t_user">

       

        <!-- id元素用于映射主键。

            子元素generator是用于指定主键生成策略的,即:某种生成主键的某种方式,

可能程序员手动指定,可能数据库中自动生成,等等。

         -->

        <id name="id">

            <!-- identity:使用数据库的自动增长策略,不是所有数据库都支持,比如oracle就不支持 ,数据库的自动增长策略时不同的。

            <generator/>

            -->

 

            <!-- sequence:在 DB2PostgreSQLOracleSAP DBMcKoi 中使用序列(sequence

                在使用Oracle数据库时可以使用这一个

            <generator/>

            -->

            以上几种是数据库的自动生成的,我们是不用管的。

            <!-- hilo,使用高低位算法生成主键值。是不依赖数据库的一种方式。

              只需要一张额外表,所有的数据都支持。

            <generator>

                <param name="table">hi_value</param>

                <param name="column">next_value</param>

                <param name="max_lo">100</param>

        </generator>

         像上面写了之后,表将自动创建出来,表名:hi_value,表中的列名:next_value

规律是:n*100+n,即生成的主键是:n*100+n,nnext_value的值

-->

       

        <!-- 根据底层数据库的能力选择 identitysequence 或者 hilo中的一个。

        <generator></generator>

         -->

 

            <!-- increment:由Hibernate维护的自动增长。

                先查询当前最大的id值,再加1使用

                不推荐使用,因为在多线程下会问题。

        <generator></generator>

            -->

           

            <!-- assigned:手工指定主键值 

        <generator></generator>

            -->

 

            <!-- uuid:由Hibernate自动生成UUID并指定为主键值。  -->

        <generator></generator>

 

        </id>

       

        <property name="name"/>

    </class>

   

</hibernate-mapping>

hibernate映射文件详解:xxx.hbm.xml文件详解

你可能感兴趣的:(hibernate映射文件详解:xxx.hbm.xml文件详解)