Hibernate 注解映射使用方式案例

Hibernate 注解映射使用方式案例

本案例使用的hibernate版本为  hibernate-release-5.2.10.Final 

为了测试,本案例在mysql数据库中创建了一个db数据库。

创建一个java项目:项目的结构如下:(lib文件夹用于存放jar包)


lib目录下则是hibernate5需要的jar包(注需要将jar加载到项目中:选中jar包右键 --》BuildPath--》Add to Build Path)

log4j.properties为日志配置文件(需要加载配置junit),此项目可以不需要日志,使用日志只是为了观察方便。
注:junit配置可以参考 http://blog.csdn.net/benxiaohai888/article/details/78231911

由于在主配置文件配置了字段创建数据表的配置,所以第一次加载时就会自动创建数据表

配置的代码:

<!-- 自动生成数据表(数据表的生成方式) -->
<property name="hbm2ddl.auto">update</property>


接下来是示例代码:

1、主配置文件 hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<session-factory>
		<!--配置一:数据库连接信息 -->
		<!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 数据库URL -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db?characterEncoding=utf8</property>
		<!--数据库用户名, -->
		<property name="hibernate.connection.username">root</property>
		<!--数据库密码 -->
		<property name="hibernate.connection.password"></property>

		<!--配置二:数据库方言配置,配置数据库方言的作用是屏蔽数据库的差异,换句话说是使hibernate框架知道 要与哪种数据库取得联系 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

		<!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> -->

		<!--配置三:其它配置 (这些配置可选) -->

		<!-- 是否在控制台显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!--是否格式化删除sql语句 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 自动生成数据表(数据表的生成方式) -->
		<property name="hbm2ddl.auto">update</property>
		<!-- 将session绑定到当前线程 -->
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 设置事务的隔离级别 -->
		<property name="hibernate.connection.isolation">4</property>

		<!-- 配置四:映射配置 -->
		<!-- 基于注解的配置方式 -->
		<mapping class="cn.sz.vo.User" />

	</session-factory>
</hibernate-configuration>
	

2、工具类(获取Session)HibernateUtil.java

package cn.sz.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	public static Session getSession() {
		Session session = null;
		// 创建一个读取主配置文件的对象
		Configuration cfg = new Configuration();
		// 读取主配置文件
		// cfg.configure("hibernate.cfg.xml");如果读取的主配置文件时默认的名字则可以省略参数
		cfg.configure();
		// 创建SessionFactory
		SessionFactory factory = cfg.buildSessionFactory();
		// 打开session
		// 我们在主配置中已经将session绑定到线程中,所以可以从线程中取出session
		// 不从线程中取出session,则可以使用 factory.openSession(); 方式获得session
		session = factory.getCurrentSession();
		return session;

	}

}


3、日志文件 log4j.properties

log4j.rootLogger=DEBUG,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.maxBackupIndex=100
##log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=c:/error1.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE.MaxFileSize=1MB


4、实体类 User.java

package cn.sz.vo;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Lob;
import javax.persistence.MapKeyColumn;
import javax.persistence.OrderColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;

@Entity // 告诉框架本类参与映射配置,必要
@Table(name = "user") // 用于配制表名称,当省略时类名称与表名称一致
public class User {
	@Id // 用于配制主属性
	@GeneratedValue(strategy = GenerationType.AUTO) // 配置数值类型的主键生成策略
	private Integer uid;

	// uuid的主键生成策略
	// @Id
	// @GeneratedValue(generator = "uuid")
	// @GenericGenerator(name = "uuid", strategy = "uuid")
	// private String uid;

	// @Transient //用于将实体类中的指定属性设置为不参与映射配置
	@Column(name = "username", length = 30) // 用于映射配制属性名和字段名的长度
	private String uname;

	@Lob // 配置大对象类型
	private String content;

	@Temporal(TemporalType.DATE) // 配置日期类型
	private Date birthday;

	@Temporal(TemporalType.TIMESTAMP) // 配置日时间类型
	private Date usertime;

	@Type(type = "byte[]") // 配置类型,可选hibernate类型或者Java类型
	@Column(name = "icon", length = 1024000)
	private byte[] photo;

	@Column(columnDefinition = "double(10,2) default '1.00'") // double类型10位,2位小数,默认值为1.00
	private Double sal;

	@Column(precision = 7, scale = 2)
	private BigDecimal comm;

	// Set集合属性
	@ElementCollection(fetch = FetchType.LAZY) // 检索策略:懒加载
	@JoinTable(name = "t_set", joinColumns = @JoinColumn(name = "uid"))
	@Column(name = "address")
	private Set<String> setAddress;

	// List集合属性
	@ElementCollection(fetch = FetchType.LAZY)
	@JoinTable(name = "t_list", joinColumns = @JoinColumn(name = "uid"))
	@OrderColumn(name = "idx")
	@Column(name = "address")
	private List<String> listAddress;

	// 数组属性
	@ElementCollection(fetch = FetchType.LAZY)
	@JoinTable(name = "t_arr", joinColumns = @JoinColumn(name = "uid"))
	@OrderColumn(name = "idx")
	@Column(name = "address")
	private String[] arrayStr;

	// Map属性
	@ElementCollection(fetch = FetchType.LAZY)
	@JoinTable(name = "t_map", joinColumns = @JoinColumn(name = "uid"))
	@MapKeyColumn(name = "key_")
	@Column(name = "address")
	private Map<String, String> mapAddress;

	public BigDecimal getComm() {
		return comm;
	}

	public void setComm(BigDecimal comm) {
		this.comm = comm;
	}

	public Set<String> getSetAddress() {
		return setAddress;
	}

	public void setSetAddress(Set<String> setAddress) {
		this.setAddress = setAddress;
	}

	public List<String> getListAddress() {
		return listAddress;
	}

	public void setListAddress(List<String> listAddress) {
		this.listAddress = listAddress;
	}

	public String[] getArrayStr() {
		return arrayStr;
	}

	public void setArrayStr(String[] arrayStr) {
		this.arrayStr = arrayStr;
	}

	public Map<String, String> getMapAddress() {
		return mapAddress;
	}

	public void setMapAddress(Map<String, String> mapAddress) {
		this.mapAddress = mapAddress;
	}

	// public Integer getUid() {
	// return uid;
	// }
	//
	// public void setUid(Integer uid) {
	// this.uid = uid;
	// }

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public Date getUsertime() {
		return usertime;
	}

	public void setUsertime(Date usertime) {
		this.usertime = usertime;
	}

	public byte[] getPhoto() {
		return photo;
	}

	public void setPhoto(byte[] photo) {
		this.photo = photo;
	}

	public Double getSal() {
		return sal;
	}

	public void setSal(Double sal) {
		this.sal = sal;
	}

}


5、测试类

package cn.sz.test;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Session;
import org.junit.Test;

import cn.sz.utils.HibernateUtil;
import cn.sz.vo.User;

public class UserTest {

	@Test
	public void testSave() {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		// 创建一个用户
		User u = new User();
		u.setUname("张三");
		u.setContent("张三的个人简介");
		u.setBirthday(new Date());
		u.setSal(1000.2266);

		// 创建Map集合
		Map<String, String> map = new HashMap<>();
		map.put("a1", "北京");
		map.put("a2", "上海");
		// 将map集合绑定到用户
		u.setMapAddress(map);

		// 创建List集合
		List<String> list = new ArrayList<>();
		list.add("南京");
		list.add("昆明");
		// 将List集合绑定到用户
		u.setListAddress(list);

		// 创建Set集合
		Set<String> set = new HashSet<>();
		set.add("西藏");
		set.add("深圳");
		// 将set集合绑定到用户
		u.setSetAddress(set);

		// 创建数组
		String[] arr = new String[2];
		arr[0] = "龙华";
		arr[1] = "澳门";
		// 将数组绑定到用户
		u.setArrayStr(arr);

		session.save(u);
		session.getTransaction().commit();
		session.close();
	}
}



由于我们配置了字段生成数据表的配置,所以在第一次测试时,将创建数据表,数据表的结构如下(每张表设置了t_为前缀):

总体预览:



数组属性生成的表 t_arr:


List属性生成的表 t_list:

set属性生成的表 t_set:



map属性生成的表t_map



user表:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值