Hibernate的属性映射配置


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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值