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>