package com.crazyit.app.domain;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
public class Student {
//多列 联合组件
private String first;
private String last;
//复合 组件
private Name names; //如果主键 为 复合组件 Name 一定要 实现 Serializable 且重写 equals() 和 hashCode()
private Integer id; //主键
private String name;
private int age;
private List<String> schools=new ArrayList<String>();
private String[] schools1;
private Set<String> schools2=new HashSet<String>();
private Collection<String> school3=new ArrayList<String>();
private Map<String,Float> scroes=new HashMap<String,Float>();
private SortedSet<String> trainings=new TreeSet<String>();
private Map<String,Name> nicks=new HashMap<String,Name>();
//如果 Map 的key 为复合组件 ,要重写 equals() 和 hashCode()
private Map<Name,Integer> nicksPower=new HashMap<Name,Integer>();
//get set
}
package com.crazyit.app.domain;
public class News {
private Integer id;
private String title;
private String content;
private String fullContent;
//get set
}
public class Name implements Serializable{
private String first;
private String last;
private Student stu;
private Map<String,Integer> power=new HashMap<String,Integer>();
//get set
@Override
public int hashCode() {}
@Override
public boolean equals(Object obj)
}
主键映射
<id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="assigned" /> </id> <id name="id" type="java.lang.Integer" column="ID"> <generator class="assigned" /> </id> <!-- 如果组件为上面的 主键 复合组件names 不是ID 就像下面配置 --> <composite-id name="names" class="Name"> <key-property name="first" type="string"/> <key-property name="last" type="string"/> </composite-id> <!-- 如果 主键 为多列联合组件 --> <composite-id> <key-property name="first" type="string"/> <key-property name="last" type="string"/> </composite-id>
普通属性映射
<property name="name" type="java.lang.String" colunm="NAME"> </property> <property name="age" type="int"> <column name="AGE" /> </property>
根据sql表达式给属性赋值
<!--表中没有这一列,通过sql来给值--> <property name="fullContent" formula="(select concat(title,content) from news nt where nt.id=id)"/> <!-- 如果表中有这一列,而这一列是在插入的时候 通过一个触发器来自动生成一个值--> <property name="fullContent" column="full_content" type="string" generated="insert"/>
映射集合属性
<!-- 映射 list --> <list name="schools" table="SCHOOL"> <key column="personid" not-null="true" /> <list-index column="list_order" /> <element type="string" column="school_name" /> </list> <!--数组的映射 element 元素必须放在下面 注意有顺序 --> <array name="schools1" table="SCHOOL"> <key column="person_id" not-null="true" /> <list-index column="list_order" /> <element type="string" column="school_name" /> </array> <!-- set集合的映射 --> <set name="school2" table="SCHOOL"> <key column="person_id" not-null="true" /> <element type="string" column="school_name" not-null="true" /> </set> <!-- collection set arrayList bag始终是无序的 --> <bag name="school3" table="SCHOOL"> <key column="person_id" not-null="true" /> <element type="string" column="school_name" not-null="true" /> </bag> <!-- map的映射 --> <map name="scores" table="SCHOOL" lazy="true"> <key column="person_id" not-null="true" /> <map-key type="string" column="subject" /> <element column="grade" type="float" /> </map> <!-- 带排序功能的sortedSet --> <set name="tranings" table="TRAININGS" sort="natural" order-by="training_name desc"> <key column="person_id" not-null="true" /> <element type="string" column="training_name" not-null="true" /> </set>
映射数据库对象(注意放的位置,不要放在class标签里面去了)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2013-12-2 22:01:23 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <!-- 显示的声明 触发器 或 存储过程 函数 DDL语言 等 --> <database-object> <create>create trigger t_full_content_gen ....</create> <drop>create trigger t_full_content_gen...</drop> <!-- 定义触发器 或者 存储过程 函数 只使用的 数据库方言 --> <dialect-scope name="org.hibernate.dialect.MySqlDialect"/> <dialect-scope name="org.hibernate.dialect.MySqlInnoDBDialect"/> </database-object> <!-- 创建表--> <database-object> <create>create table test(t_name varchar(255));</create> <drop></drop> <dialect-scope name="org.hibernate.dialect.MySqlDialect"/> <dialect-scope name="org.hibernate.dialect.MySqlInnoDBDialect"/> </database-object> </hibernate-mapping>
使用SchemaExport 工具.单独根据映射文件生成数据库对象
@Test
public void test6(){ //如果这是想用 hibernate 根据 映射文件来生成 数据对象 ,比如 表 ,存储过程,触发器, 函数 等 ..
//SchemaExport 提供了一个 main方法,可以使用 java命令还执行,
//java -cp hiberante_classpaths org.hibernate.tool.hbm2ddl.SchemaExport opetions mapping_files
Configuration con=new Configuration().configure();
SchemaExport se=new SchemaExport(con);
se.setFormat(true)
.setOutputFile("c:\\new.sql")
.create(true, true);
}
映射组件属性(即,包含的属性不是数据库中持久化对象,没有table)
<!-- 映射组件属性 以及 组件属性中含有 集合 --> <component name="names" class="Name" unique="true"> <parent name="stu"/> <property name="first" type="string"/> <property name="last" type="string"/> <map name="power" table="name_power"> <key column="person_name_id" not-null="true"/> <map-key type="string" column="name_aspect"/> <element column="name_power" type="int"/> </map> </component> <!-- 集合中含有 组件属性 --> <map name="nicks" table="nick_inf"> <key column="person_id" not-null="true"/> <map-key type="string" column="phase"/> <composite-element class="Name"> <parent name="stu"/> <property name="first"/> <property name="last"/> </composite-element> </map> <!-- 组件属性 作为 Map的key --> <map name="nicksPower" table="nick_power"> <key column="person_id" not-null="true"/> <composite-map-key class="Name"> <key-property name="first" type="string"/> <key-property name="last" type="string"/> </composite-map-key> <element column="nick_power" type="int"/> </map>