zoukankan      html  css  js  c++  java
  • Hibernate hbm映射文件的详解

    错误演示

    第一步:导入jar包   省略

    第二部:创建Person类

    package cn.hibernate.bean;

    import java.util.Date;

    public class Person {

    private Integer pId;
    private String pName;
    private int age;
    private Date brithdayDate;
    private boolean gender;
    private byte[] photo;
    private String desc; //描述




    public Integer getpId() {
    return pId;
    }
    public void setpId(Integer pId) {
    this.pId = pId;
    }

    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    public String getpName() {
    return pName;
    }
    public void setpName(String pName) {
    this.pName = pName;
    }
    public Date getBrithdayDate() {
    return brithdayDate;
    }
    public void setBrithdayDate(Date brithdayDate) {
    this.brithdayDate = brithdayDate;
    }
    public boolean isGender() {
    return gender;
    }
    public void setGender(boolean gender) {
    this.gender = gender;
    }
    public byte[] getPhoto() {
    return photo;
    }
    public void setPhoto(byte[] photo) {
    this.photo = photo;
    }
    public String getDesc() {
    return desc;
    }
    public void setDesc(String desc) {
    this.desc = desc;
    }
    }

    第三步:创建Person的映射文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.hibernate.bean">
    <!--
    <class>标签:配置对象与表 之间关系
    *name:默认情况,确定对象全限定类名
    如果在<hibernate-mapping>配置package,确定javabean所在的包,可以只简单类名
    *table:数据库的表名
    *catalog:使用的数据库名称,默认值:hibernate.cfg.xml配置url设置的数据库名称
    url # jdbc:mysql://localhost:3306/minemysql
    <id>标签配置主键,要求每一个表都应该存在主键
    * name :确定javabean那个属性作为主键
    <property>标签 配置javabean的普通属性
    * name: 确定属性名称
    * type: 确定属性类型
    java类型:type="java.lang.String"
    hibernate类型:type="string"
    timestamp:时间戳,数据更改,当前字段内容将自动使用系统时间
    time:时间
    date:日期
    binary:二进制,大数据类型
    数据库类型: 使用子标签<column>
    name:列名
    sql-type:数据库类型。例如:varchar(50)
    * column: 数据库的列名:默认值与name的取值相同
    * length: 确定列的大小
    * unique:唯一(添加唯一约束)
    * not-null:不为空
    -->
    <class name="Person" table="t_person">
    <id name="pId">
    <!-- 主键生成策略:固定值 -->
    <generator class="native"></generator>
    </id>
    <property name="pName" >
    <column name="pName" sql-type="varchar(50)"></column>
    </property>
    <property name="age" type="integer" column="age"></property>
    <property name="brithdayDate" type="date"></property>
    <property name="gender" type="boolean"></property>
    <property name="photo" type="binary" not-null="true" unique="false" length="350000"></property>
    <property name="desc" column="`desc`"></property>
    </class>
    </hibernate-mapping>

    第四步:创建核心配置文件hibernate.cfg.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <!-- #1 基本的四项
    property.name 取值如果以‘hibernate’开头,可以省略
    以“hibernate.connection.driver_class”与“connection.driver_class”相同
    -->
    <property name="hibernate.connection.driver_class">
    com.mysql.jdbc.Driver
    </property>
    <property name="hibernate.connection.url">
    jdbc:mysql://localhost:3306/minemysql
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <!-- #2方言 -->
    <property name="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    </property>


    <!-- #3 sql -->
    <!-- 是否显示sql语句 -->
    <property name="hibernate.show_sql">true</property>
    <!-- 是否格式化sql语句 不格式化显示一行 格式化显示多行 -->
    <property name="hibernate.format_sql">true</property>
    <!-- 是否显示注释,提供当前sql语句操作对象 -->
    <property name="hibernate.use_sql_comments">true</property>


    <!-- #4如何创建表(不重要)
    create:每一次加载cfg.xml文件都将创建表,程序关闭时,表不进行删除 [初始化,测试时使用]
    如果表存在则先删除后创建
    create-drop:每一次加载cfg.xml文件都将创建表,程序关闭时,表进行删除
    必须执行factory.close()才能删除
    update:如果表不存在则创建,如果表存在,先回检查*.hbm.xml文件是否和表匹配,
    如果不匹配将更新表结构(只添加,不删除)
    validate:加载cfg.xml进效验,映射文件和数据表是否匹配,如果匹配正常操作,如果不匹配则抛出异常
    ### 显示的开发中先有的表,再有的映射文件
    * 表 由DBA创建
    -->
    <property name="hibernate.hbm2ddl.auto">update</property>


    <!-- #5取消bean效验 -->
    //省略下面会给讲解什么时候需要配置<property name="javax.persistence.validation.mode">none</property>

    </session-factory>
    </hibernate-configuration>

    第五步:创建测试类

    package cn.hibernate.test;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Date;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;

    import cn.hibernate.bean.Person;

    public class TestApp {

    @Test
    public void demo01() throws IOException{
    FileInputStream is = new FileInputStream(new File("1.jpg"));
    byte[] photo = new byte[is.available()];
    is.read(photo);
    is.close();

    Person son = new Person();
    son.setpName("杰克1");
    son.setAge(19);
    son.setBrithdayDate(new Date());
    son.setGender(true);
    son.setPhoto(photo);
    son.setDesc("这个家伙有头像");





    Configuration configuration = new Configuration().configure();
    //采用手动方式添加
    configuration.addClass(Person.class);

    SessionFactory sessionFactory = configuration.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();

    session.save(son);

    transaction.commit();
    session.close();
    sessionFactory.close();


    }
    }

    测试时出现的错误如下解决

    如果出现图片太大可以在映射文件中来修改所能保存图片的大小

    出现:org.hibernate.HibernateException: Unable to get the default Bean Validation factory     错误

    分析:在javaweb6.0项目中添加一个jar 

    解决:hibernate.cfg.xml中配置取消  

    特殊字符

    分析:sql数据不能使用关键字(desc,order等)

    解决方法:在列名的左右添加重音符 ("``")

  • 相关阅读:
    git 备查
    PyQt5 信号与槽机制
    Python 循环报错 'int' object is not iterable
    docker instructions命令及dockerfile实践
    shell脚本中set指令
    你知道什么是Python算法和数据结构、抽象数据和面向对象、数组和列表、链表吗?
    Python爬虫抓取B站人类高质量男性求偶视频的弹幕,康康都在讨论什么!❤️
    Python从入门到精通要掌握哪些基础知识?
    想搞个恶作剧吗? 代码丢给他,生死有命富贵在天,看我学会python用代码整蛊朋友
    妹妹画的小恐龙和我用Python画的小恐龙,你更加喜欢谁的!❤️
  • 原文地址:https://www.cnblogs.com/MisterLiu/p/6935477.html
Copyright © 2011-2022 走看看