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)
}
[b][size=small]主键映射[/size][/b]
<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>
[b][size=small]普通属性映射[/size][/b]
<property name="name" type="java.lang.String" colunm="NAME">
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
[b][size=small]根据sql表达式给属性赋值[/size][/b]
<!--表中没有这一列,通过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"/>
[b][size=small]映射集合属性[/size][/b]
<!-- 映射 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>
[b][size=small]映射数据库对象(注意放的位置,不要放在class标签里面去了)[/size][/b]
<?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>
[b][size=small]使用SchemaExport 工具.单独根据映射文件生成数据库对象[/size][/b]
@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);
}
[b][size=small]映射组件属性(即,包含的属性不是数据库中持久化对象,没有table)[/size][/b]
<!-- 映射组件属性 以及 组件属性中含有 集合 -->
<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>