Hibernate的核心功能是根据数据库到实体类的映射,自动从数据库绑定数据到实体类。html
使咱们操做实体类(Java对象)就能对数据库进行增、删、查、改,而不用调用JDBC API使数据操做变得简单而不繁琐。java
本文就主要讲解Hibernate的映射文件的映射机制,但本文讲解的重点在于经过Hibernate如何配置实体类到数据库表的映射,至于数据库表(或实体类)之间的各类关联关系的映射会在后面的文章中讲到。node
<?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="model" default-lazy="true" default-access="property" default-cascade="none"> <class name="Teacher" table="tb_teacher" dynamic-insert="true" dynamic-update="true" lazy="true"> <id name="id" column="id" type="long"> <generator class="native"></generator> </id> <property name="no" column="no" type="string" not-null="true"/> <property name="name" column="name" type="string" access="field"/> <property name="sex" column="sex" type="string" update="true"/> <property name="job_title" column="job_title" type="string" insert="true"/> </class></hibernate-mapping>
<hibernate-mapping catalog="shopping" default-cascade="none|all|save-update|delete" default-access="property|field|ClassName" default-lazy="true|false" auto-import="true|false" package="package.name">
- schema="dbo"
<class table="TableName" dynamic-insert="false|true" dynamic-update="false|true" lazy="false|true" optimistic-lock="version" mutable="false|true" select-before-update="false|true" batch-size="5" subselect="SQL expression" where="arbitrary sql where condition" check="arbitrary sql check condition" persister="PersisterClass" schema="schema" catalog="catalog" entity-name="EntityName" proxy="ProxyInterface" polymorphism="implicit" abstract="false|true" discriminator-value="discriminator-value" rowid="rowid" node="element-name">
- name="EntityClassName"
<id name="PropertyName" column="TableColumn" type="TypeName" length="ColumnLength" access="field|property|ClassName" unsaved-value="null|any|none|undefined|id_value" node="element-name"> <generator class="native"></generator></id>
- <generator class="native"></generator>
<property name="PropertyName" column="TableColumn" type="ColumnType" length="ColumnLength" unique-key="unique-key" unique="true|false" not-null="true|false" insert="true|false" update="true|false" lazy="true|false" access="field|property|ClassName" formula="arbitrary SQL expression" generated="never|insert|always" index="index_name" optimistic-lock="true" precision="10" scale="6" node="element-name">
<hibernate-configuration> <session-factory> <!-- 设置实体类到数据库的映射文件 --> <mapping resource="org/hbm/Teacher.txt"/> </session-factory></hibernate-configuration>
package model;public class People{ private String firstName; private String lastName; private String sex; /** 数据处理 */ public String getName() { return firstName + " " + lastName; } /** 数据验证 */ public void setSex(String sex) { if("男".equals(sex) || "女".equals(sex)) { this.sex = sex; } } //其余省略...}
<hibernate-mapping package="model"> <class name="People" table="tb_people"> <!-- 省略其余 --> <property name="name" column="name" type="string" access="property"/> <property name="sex" column="sex" type="string" access="property"/> </class></hibernate-mapping>
<property name="avgAge" formula="select avg(age) from tb_people"/>
select name,sex ...,( select avg(age) from tb_people ) as avgAge from tb_people where id=1
<property name="homeAddress" column="'Home Address'" type="string"/>
<class name="People"><!-- 默认 table="People" --> <id name="id"><!-- 默认 column="id" --> <generator class="native"></generator> </id> <property name="name"/><!-- 默认 column="name" --> <property name="sex"/><!-- 默认 column="sex" --></class>
<id name="id"> <meta attribute="scope-set">private</meta> <generator class="increment"></generator></id><id name="id"> <meta attribute="scope-set">private</meta> <generator class="identity"></generator></id><id name="id"> <meta attribute="scope-set">private</meta> <generator class="sequence"> <param name="sequence">sequence_name</param> </generator></id><id name="id"> <meta attribute="scope-set">private</meta> <generator class="hilo"> <param name="table">hi_value</param> <param name="cloumn">next_value</param> <param name="max_lo">100</param> </generator></id><id name="id"> <meta attribute="scope-set">private</meta> <generator class="native"></generator></id>
<composite-id> <key-property name="name" column="name"/> <key-property name="address" column="address"/></composite-id>
public class KeyUtils implements org.hibernate.id.IdentifierGenerator, org.hibernate.id.Configurable{ private String formatDateString; @Override public void configure(Type type, Properties params, Dialect d) throws MappingException { formatDateString = params.getProperty("formatDateString"); if(formatDateString.length() < 14) { formatDateString="yyyyMMddhhmmss"; } } @Override public Serializable generate(SessionImplementor session, Object object) throws HibernateException { Date today = new Date(); SimpleDateFormat formatDate = new SimpleDateFormat(formatDateString); String time = formatDate.format(today); return time; }}
<id name="id" column="id"> <generator class="org.KeyUtils"> <param name="formatDateString">yyyyMMddhhmmss</param> </generator> </id>