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)
}


主键映射


<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> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值