前一篇文章说了下Spring的注解,下面继续聊下Hibernate的注解。
用过Hibernate的同学应该都知道,Hibernate的配置文件其实蛮麻烦的,虽然我们可以通过MyEclipse等集成环境可以自动生成,但是当项目大了,文件那么多就显得很笨重了。所以在最近版本的Hibernate中,就出现了一种基于Java5注释的方法。借助Hibernate Annotation库,可以通过对实体类注释的方式摆脱繁琐的配置文件。也就是可以不用定义持久化类对应的 *.hbm.xml文件,直接以注解方式写入持久化类中实现。
1. 使用Hibernate注解的相关配置
- 第一步,环境与jar包:
至少需要具备 Hibernate 3和Java 5。除了标准的 Hibernate JAR 和依赖项之外,还需要添加hibernate3.2.jar,hibernate-annotations- 3.3.0.jar,hibernate-commons-annotations.jar和ejb3-persistence.jar 。这样就可以使用hibernate的annotation了。
注意:Hibernate注解使用了ejb JPA的注解,所以,下面安装配置hibernate annotation环境时,需要导入ejb的包。(他俩的关系就比如:JPA是接口,Hibernate注解是一个比较好的实现) -
XML的相关配置
现在很多项目都会是用Spring框架,我在这里晒一个结合Spring的Hibernate配置,这里是在Spring的配置文件中配置的。<!-- 配置SessionFactoryBean -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<!--dataSource属性指定要用到的数据源,因此在Hibernate的核心配置文件中就无需再配置与数据库连接相关的属性-->
<property name="dataSource" ref="xxDataSource" />
<property name="hibernateProperties">
<props>
<!-- Hibernate基本配置 -->
<!-- Hibernate对PostgreSQL数据库的方言支持-->
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<!--连接池大小-->
<prop key="hibernate.connection.pool_size">10</prop>
....
</props>
</property>
<!-- 加入使用注解的实体类 -->
<property name="annotatedClasses">
<list>
<value>com.xx.xx(具体实体类路径)</value>
<value>com.xx.xx(具体实体类路径)</value>
...
</list>
</property>
<!-- 也可以用扫描的方式-->
<property name="packagesToScan">
<list>
<value>com.onjava.modelplanes.domain.*</value>
</list>
</property>
</bean>
值得注意的一点就是:除了常用的Hibernate配置外,还需要对需要注解的实体类或者包进行配置。
2. 一些开发常用的注解
一般像一些比较复杂的注解,基本用的很少,比如持久化POJO类跟数据库表:一对多,多对多。这个就比较麻烦了,我们在企业的项目中宁愿选择新建一个其他的对象包含这两个实体,而不是做这么多复杂的配置。讲道理,完全用注解配置对于一些维护方面个人觉得稍微有一点影响。所以这里也就罗列一些简单的常用的注解:
-
常用注解
@Entity —— 注释声明该类为持久类。
@Id —— 注解声明了该实体bean的标识属性(对应表中的主键)。
@Table —— 注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字
@Temporal(TemporalType.TIMESTAMP)--声明时间格式
@Transient --将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑需要,这时,须将这些属性进行transient的注解.否则系统会因映射不到数据表相应字段而出错.
@Column —— 注解声明了属性到列的映射。该注解有如下的属性
name 可选,列名(默认值是属性名)
unique 可选,是否在该列上设置唯一约束(默认值false)
nullable 可选,是否设置该列的值可以为空(默认值false)
insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
length 可选,列长度(默认值255)
@GeneratedValue —— 注解声明了主键的生成策略。该注解有如下属性
strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO
GenerationType.AUTO 主键由程序控制
GenerationType.TABLE 使用一个特定的数据库表格来保存主键
GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)
GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用)
generator 指定生成主键使用的生成器(可能是orcale中的序列)。
@SequenceGenerator —— 注解声明了一个数据库序列。该注解有如下属性
name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中
sequenceName 表示生成策略用到的数据库序列名称。
initialValue 表示主键初始值,默认为0.
allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50.
@GenericGenerator —— 注解声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性
name 指定生成器名称
strategy 指定具体生成器的类名(指定生成策略)。
parameters 得到strategy指定的具体生成器所用到的参数。
- 案例:
这里拿项目中的一个实体类做下简单的描述,基本的用法呢也就这样,太复杂的不建议去配置。
package com.hik.gcs.sysConfig.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="user_info")
/* 配置Sequence生成器,name为生成器名称,sequenceName为数据中的序列名称 */
@SequenceGenerator(name="s_user_info", allocationSize=1, initialValue=100,sequenceName="s__user_info")
public class UserInfo {
private Integer userId; //用户id
private String userName;//用户名
private String userPwd;//用户密码
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "s_user_info")
@Column(name = "user_id", unique = true, nullable = false)
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
@Column(name = "user_name", unique = true, nullable = false)
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Column(name = "user_pwd", nullable = true)
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}