重拾ssh之hibernate配置

本文详细介绍了Hibernate框架的基本配置方法,包括核心配置文件hbm.cfg.xml的设置及基于注解的实体映射配置。涵盖数据库连接参数设定、主键生成策略、实体类属性映射等关键内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hbm.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-configuration PUBLIC
           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

	<session-factory>
		<!-- 设置驱动类 -->
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 设置连接池默认个数 -->
		<property name="connection.pool_size">20</property>
		<!-- 设置JDBC URL -->
		<property name="connection.url">jdbc:mysql://localhost:3306/tlfdb</property>
		<!-- 设置数据库用户名 -->
		<property name="connection.username">root</property>
		<!-- 设置数据库用户密码 -->
		<property name="connection.password">111111</property>
		<!-- 设置SQL方言 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 设置是否显示SQL语句 -->
		<property name="show_sql">true</property>
		<!-- 设置格式化SQL语句 -->
		<property name="format_sql">true</property>

		<property name="hbm2ddl.auto">update</property>

		<mapping resource="com/cts/elt/Person.hbm.xml" />
	    <mapping class="com.cts.elt.Teacher"/>
	</session-factory>

</hibernate-configuration>
这里别的配置不多说了,稍提一下这个属性<property name="hbm2ddl.auto">update</property>

hbm2ddl.auto可配置为create,update, validate,create_drop,

validate         加载hibernate时,验证创建数据库表结构
 create         每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。即使做的是插入操作,也会先删除表,在插入数据
 create-drop       加载hibernate时创建,退出是删除表结构
 update               加载hibernate自动更新数据库结构

Person.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<!-- 设置实体类与数据库中表的对应关系 -->
	<class name="com.cts.elt.Person" table="Person">
		<id name="id">
			<!-- 将逐渐设置为自增 -->
			<generator class="native"></generator>
		</id>
		<property name="username"  not-null="true"></property>
		<property name="password"></property>
		<property name="caption"></property>
		<property name="content"></property>
	</class>
</hibernate-mapping>


着重提一下主键生成策略,这里的<generator class=""></generator>节点

其中可以填写的属性有很多,提一下比较常用的4个

identity:采用数据库提供的主键生成机制,如MySql、DB2、SqlServe设置自增主键后比较常用

native:由Hibernate根据底层数据库定义自行判断采用identity、hilo、sequence其中一种作为主键生成方式,由Hibernate决定

sequence:使用数据库的sequence机制。比如oracle数据库

uuid.hex:由Hibernate基于128 位唯一值产生算法,根据IP、当前时间、JVM启动时间、内部自增量生成16 进制数值(编码后以长度32 的字符串表示)作为主键,该方法提供了最好的数据库插入性能和数据库平台适应性


下面着重提一下基于annotation的配置

package com.cts.elt;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
@Table(name="teacher")
public class Teacher {

	private int id;
	private String name;
	private String title;
	private String wifeName;
	private Date birthday;
	
	
	@Temporal(TemporalType.TIMESTAMP)//只插入日期。。TemporalType.TIME //只插入时间
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	@Transient //透明的,不存进数据库
	public String getWifeName() {
		return wifeName;
	}
	public void setWifeName(String wifeName) {
		this.wifeName = wifeName;
	}
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@Column(name="name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	
	
}

1、一般主键生成策略的annotation放在get方法上,而不是放在private字段上,因为放在字段上,破坏了Java的封装性,Hibernate会访问到该字段。养成习惯

2、在实体类上加上@Entity,注意此处所有的annotation都引入javax.persistence.下的annotation,而不是Hibernate的annotation。。这已经成为一种规范,

3、@GeneratedValue(strategy=GenerationType.IDENTITY)这句就是设置它的主键生成策略,其中有很多方式,不一一罗列了

4、在不需要插入进数据库上的字段加入@Transient

5、如果实体类的名字和映射表明相同,那不需要加上@TABLE,不然需要指定这个属性,如:这里改成@TABLE(name="_teacher")则表明映射的表为_teacher而不是teacher,映射字段是也是如此

6、插入DATE类型的字段是,在字段的get方法上加上@Temporal(TemporalType.TIMESTAMP),这里表示插入的时间包括日期和时间,若想只插入时间,那就改成TemporalType.TIME,如想直插入日期TemporalType.DATE

7、要用annotation的方式映射,必须在hbm.cfg.xml加入mapping class="com.cts.elt.Teacher"/>就可以了,,比起xml的配置方式方便很多了

以后会慢慢抛弃xml的配置方式,改为annotation的方式,还有很多annotation的用法,用到时候查看api文档就行,今天先写那么多

补充一点:如果你hbm.cfg.xml中既有xml配置又有annotation的映射配置时,例如<mapping resource="com/cts/elt/Person.hbm.xml" />
    和<mapping class="com.cts.elt.Teacher"/>,,那么必须使用Configuration cfg = new AnnotationConfiguration().configure();读取配置文件,不然就会报错,AnnotationConfiguration是Configuration的子类,功能更强大


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值