1 orm元数据配置文件(映射文件)
<?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"> <!-- 配置表与实体的关系 --> <!-- package属性:填写一个包名。在元素内部凡是需要书写完整类名得属性,可以直接写简单类名就可以了 --> <hibernate-mapping package="www.test.domain"> <!--Class元素:配置实体与表得对应关系得 name:完整类名 table:数据库表名 --> <class name="Customer" table="cst_customer"> <!--id:配置主键映射得属性 name:填写主键对应得属性名 column:填写表中得主键得列名 默认值:列名会默认使用属性名 type:填写列(属性)得类型。hibernate会自动检测实体的属性类型 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型 java类型: <property name="cust_name" column="cust_name" type="java.lang.String"></property> hibernate类型: <property name="cust_name" column="cust_name" type="string"></property> 数据库类型: <property name="cust_name" column="cust_name" > <column name="cust_name" sql-type="varchar"></column> </property> 注意:不建议指定,自动检测实体属性类型就可以。 not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空 <property name="cust_name" column="cust_name" not-null="true"></property> length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。 --> <id name="cust_id" column="cust_id" > <!-- generator:主键生成得策略(后面讲) --> <generator class="native"></generator> </id> <!-- property:配置除了id之外得普通属性映射 name:填写属性名 column(可选):填写属性对应得列名 默认值:列名会默认使用属性名 type:填写列(属性)得类型。hibernate会自动检测实体的属性类型 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型 java类型: <property name="cust_name" column="cust_name" type="java.lang.String"></property> hibernate类型: <property name="cust_name" column="cust_name" type="string"></property> 数据库类型: <property name="cust_name" column="cust_name" > <column name="cust_name" sql-type="varchar"></column> </property> 注意:不建议指定,自动检测实体属性类型就可以。 not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空 <property name="cust_name" column="cust_name" not-null="true"></property> length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。 --> <property name="cust_name" column="cust_name" length=""></property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" column="cust_level"></property> <property name="cust_linkman" column="cust_linkman"></property> <property name="cust_phone" column="cust_phone"></property> <property name="cust_mobile" column="cust_mobile"></property> </class> </hibernate-mapping>
一对多&多对一关系映射
一的一方的配置
<?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"> <!-- 配置表与实体的关系 --> <!-- package属性:填写一个包名。在元素内部凡是需要书写完整类名得属性,可以直接写简单类名就可以了 --> <hibernate-mapping package="www.test.domain"> <!--Class元素:配置实体与表得对应关系得 name:完整类名 table:数据库表名 --> <class name="Customer" table="cst_customer"> <!--id:配置主键映射得属性 name:填写主键对应得属性名 column:填写表中得主键得列名 默认值:列名会默认使用属性名 type:填写列(属性)得类型。hibernate会自动检测实体的属性类型 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型 java类型: <property name="cust_name" column="cust_name" type="java.lang.String"></property> hibernate类型: <property name="cust_name" column="cust_name" type="string"></property> 数据库类型: <property name="cust_name" column="cust_name" > <column name="cust_name" sql-type="varchar"></column> </property> 注意:不建议指定,自动检测实体属性类型就可以。 not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空 <property name="cust_name" column="cust_name" not-null="true"></property> length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。 --> <id name="cust_id" column="cust_id" > <!-- generator:主键生成得策略(后面讲) --> <generator class="native"></generator> </id> <!-- property:配置除了id之外得普通属性映射 name:填写属性名 column(可选):填写属性对应得列名 默认值:列名会默认使用属性名 type:填写列(属性)得类型。hibernate会自动检测实体的属性类型 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型 java类型: <property name="cust_name" column="cust_name" type="java.lang.String"></property> hibernate类型: <property name="cust_name" column="cust_name" type="string"></property> 数据库类型: <property name="cust_name" column="cust_name" > <column name="cust_name" sql-type="varchar"></column> </property> 注意:不建议指定,自动检测实体属性类型就可以。 not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空 <property name="cust_name" column="cust_name" not-null="true"></property> length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。 --> <property name="cust_name" column="cust_name"></property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" column="cust_level"></property> <property name="cust_linkman" column="cust_linkman"></property> <property name="cust_phone" column="cust_phone"></property> <property name="cust_mobile" column="cust_mobile"></property> <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名 --> <!-- 级联操作: cascade save-update: 级联保存更新 delete:级联删除 all:save-update+delete 级联操作: 简化操作.目的就是为了少写两行代码. --> <!-- inverse属性: 配置关系是否维护. true: customer不维护关系 false(默认值): customer维护关系 inverse属性: 性能优化.提高关系维护的性能. 原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃. --> <set name="linkMans" inverse="true"> <key column="lkm_cust_id"></key> <one-to-many class="LinkMan"/> </set> </class> </hibernate-mapping>
多的一方的配置
<?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="www.test.domain"> <class name="LinkMan" table="cst_linkman"> <id name="lkm_id"> <generator class="native"></generator> </id> <property name="lkm_gender"></property> <property name="lkm_name"></property> <property name="lkm_phone"></property> <property name="lkm_mobile"></property> <property name="lkm_email"></property> <property name="lkm_qq"></property> <property name="lkm_position"></property> <property name="lkm_memo"></property> <!-- 多对一 --> <!-- name属性:引用属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名 --> <!-- 级联操作: cascade save-update: 级联保存更新 delete:级联删除 all:save-update+delete 级联操作: 简化操作.目的就是为了少些两行代码. --> <!-- 多的一方: 不能放弃维护关系的.外键字段就在多的一方. --> <many-to-one name="customer" column="lkm_cust_id" class="Customer"> </many-to-one> </class> </hibernate-mapping>
多对多
<?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="www.test.domain"> <class name="Role" table="sys_role"> <id name="role_id" column="role_id"> <generator class="native"></generator> </id> <property name="role_name"></property> <property name="role_memo"></property> <!-- 多对多关系表达 --> <!-- name: 集合属性名 table: 配置中间表名 key |-column:外键,别人引用"我"的外键列名 class: 我与哪个类是多对多关系 column:外键.我引用别人的外键列名 --> <!-- cascade级联操作: save-update: 级联保存更新 delete:级联删除 all:级联保存更新+级联删除 结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update. 如果使用delete操作太过危险.尤其在多对多中.不建议使用. --> <!-- 使用inverse属性 true: 放弃维护外键关系 false(默认值):维护关系 结论: 将来在开发中,如果遇到多对多关系.一定要选择一方放弃维护关系. 一般谁来放弃要看业务方向. 例如录入员工时,需要为员工指定所属角色. 那么业务方向就是由员工维护角色. 角色不需要维护与员工关系.角色放弃维护 --> <set name="users" table="sys_user_role" inverse="true"> <key column="role_id"></key> <many-to-many class="User" column="user_id"></many-to-many> </set> </class> </hibernate-mapping>
<?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="www.test.domain"> <class name="User" table="sys_user"> <id name="user_id" column="user_id"> <generator class="native"></generator> </id> <property name="user_code"></property> <property name="user_name"></property> <property name="user_password"></property> <property name="user_state"></property> <!-- 多对多关系表达 --> <!-- name: 集合属性名 table: 配置中间表名 key |-column:外键,别人引用"我"的外键列名 class: 我与哪个类是多对多关系 column:外键.我引用别人的外键列名 --> <!-- cascade级联操作: save-update: 级联保存更新 delete:级联删除 all:级联保存更新+级联删除 结论: cascade简化代码书写.该属性使不使用无所谓. 建议要用只用save-update. 如果使用delete操作太过危险.尤其在多对多中.不建议使用. --> <set name="roles" table="sys_user_role" cascade="save-update"> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </set> </class> </hibernate-mapping>
加入类加载策略和关联级别加载策略
<?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"> <!-- 配置表与实体的关系 --> <!-- package属性:填写一个包名。在元素内部凡是需要书写完整类名得属性,可以直接写简单类名就可以了 --> <hibernate-mapping package="www.test.domain"> <!--Class元素:配置实体与表得对应关系得 name:完整类名 table:数据库表名 --> <class name="Customer" table="cst_customer" lazy="false"> <!--id:配置主键映射得属性 name:填写主键对应得属性名 column:填写表中得主键得列名 默认值:列名会默认使用属性名 type:填写列(属性)得类型。hibernate会自动检测实体的属性类型 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型 java类型: <property name="cust_name" column="cust_name" type="java.lang.String"></property> hibernate类型: <property name="cust_name" column="cust_name" type="string"></property> 数据库类型: <property name="cust_name" column="cust_name" > <column name="cust_name" sql-type="varchar"></column> </property> 注意:不建议指定,自动检测实体属性类型就可以。 not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空 <property name="cust_name" column="cust_name" not-null="true"></property> length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。 --> <id name="cust_id" column="cust_id" > <!-- generator:主键生成得策略(后面讲) --> <generator class="native"></generator> </id> <!-- property:配置除了id之外得普通属性映射 name:填写属性名 column(可选):填写属性对应得列名 默认值:列名会默认使用属性名 type:填写列(属性)得类型。hibernate会自动检测实体的属性类型 每个类型有三种写法:分别是java类型 | hibernate类型 | 数据库类型 java类型: <property name="cust_name" column="cust_name" type="java.lang.String"></property> hibernate类型: <property name="cust_name" column="cust_name" type="string"></property> 数据库类型: <property name="cust_name" column="cust_name" > <column name="cust_name" sql-type="varchar"></column> </property> 注意:不建议指定,自动检测实体属性类型就可以。 not-null(可选):配置该属性(列)是否不能为空,默认值false默认可以为空 <property name="cust_name" column="cust_name" not-null="true"></property> length(可选):配置数据库中列的长度。 默认值:使用数据库类型的最大长度 varchar默认最大长度255。 --> <property name="cust_name" column="cust_name"></property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" column="cust_level"></property> <property name="cust_linkman" column="cust_linkman"></property> <property name="cust_phone" column="cust_phone"></property> <property name="cust_mobile" column="cust_mobile"></property> <!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名 --> <!-- 级联操作: cascade save-update: 级联保存更新 delete:级联删除 all:save-update+delete 级联操作: 简化操作.目的就是为了少写两行代码. --> <!-- inverse属性: 配置关系是否维护. true: customer不维护关系 false(默认值): customer维护关系 inverse属性: 性能优化.提高关系维护的性能. 原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃. --> <!-- lazy属性: 决定是否延迟加载 true(默认值): 延迟加载,懒加载 false: 立即加载 extra: 极其懒惰 fetch属性: 决定加载策略.使用什么类型的sql语句加载集合数据 select(默认值): 单表查询加载 join: 使用多表查询加载集合 subselect:使用子查询加载集合 --> <!-- batch-size: 抓取集合的数量为3. 抓取客户的集合时,一次抓取几个客户的联系人集合. --> <set name="linkMans" inverse="true" batch-size="3"> <key column="lkm_cust_id"></key> <one-to-many class="LinkMan"/> </set> </class> </hibernate-mapping>
2 hibernate主配置文件 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> <!-- #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password --> <!-- 数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 数据库的url --> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <!-- /// 表示连接本机 --> <!-- 数据库连接的用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库连接密码 --> <property name="hibernate.connection.password">root</property> <!-- 数据库方言 不同的数据库中,sql语法略有区别,指定方言可以让hibernate框架生成sql语句时。针对数据库方言生成。 sql99标准:DDL 定义语言 库表的增删改查 DML 控制语言 事务权限 DCL 操作语言 针对增删改查 注意事项:MySQL在选择方言时候,请选择最短的方言。 org.hibernate.dialect.MySQLDialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</property> <!-- #hibernate.show_sql true //打印生成的sql #hibernate.format_sql true //格式化sql 如果不格式都会在一行 --> <!--将hibernate生成的sql语言打印到控制台 --> <property name="hibernate.show_sql">true</property> <!--将hibernate生成的sql语句格式化(语法缩进) --> <property name="hibernate.format_sql">true</property> <!-- ## auto schema export 自动导出表结构 。 自动建表 #hibernate.hbm2ddl.auto create-drop 自动建表。每次框架运行结束都会将所有的表删除。(开发环境中测试使用) #hibernate.hbm2ddl.auto create 自动建表。每次框架的运行都会自动创建新的表。以前表将会被覆盖,表数据会丢失,(开发环境中测试使用) #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表。如果已经存在不会再生成。如果表有变动。自动更新表(不会删除任何数据) #hibernate.hbm2ddl.auto validate 校验。不自动生成表。每次启动会校验数据库中表是否正确。校验失败 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入orm元数据 路径书写:填写src下的路径 --> <mapping resource="www/test/domain/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>
3 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> <!--五个基本配置 ## MySQL #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!--sql的2个可选配置 #hibernate.show_sql true #hibernate.format_sql true --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!--表的策略可选配置 ## auto schema export #hibernate.hbm2ddl.auto create-drop #hibernate.hbm2ddl.auto create #hibernate.hbm2ddl.auto update #hibernate.hbm2ddl.auto validate --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 指定隔离级别 #hibernate.connection.isolation 4 --> <property name="hibernate.connection.isolation">4</property> <!-- 指定session与当前线程绑定 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 引入orm元数据 --> <mapping resource="www/java/domain/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>