java

位置:IT落伍者 >> java >> 浏览文章

学习JPA——Hibernate Annotation使用实例


发布日期:2020年06月30日
 
学习JPA——Hibernate Annotation使用实例
目前JPA(Java Persistence API)的使用范围越来越广作为Java EE 平台标准的ORM规范得到了诸如HibernateTopLinkOpenJpa等ORM框架的支持同时还是EJB 的重要组成部分JPA的宗旨是为POJO提供持久化标准规范它能够脱离容器独立运行方便开发和测试本文将通过一个小实例来说明如何在Hibernate中使用JPA来达到简化编程的目的

开发环境Eclipse MyEclipse GA Tomcat SQL Server

hibernateGA hibernateannotationsGA

ejbpersistence hibernatecommonsannotationsGA

本文是为后续的多种Ajax技术框架应用系列作一个前期准备让大家先了解一下相比与以前的Hibernate ORM映射的不同之处以及采用JPA所带来的好处

为了保证程序能顺序运行避免不同的Eclipse版本之间产生错误大象强烈建议下载源码后按源码中的工程名自己单独新建同一个工程再将src和WEBINF/lib目录下的所有文件COPY至对应的目录下

创建Web Project

点击File>New选择Web ProjectProject Name中输入ajax点击Finish下载本文后面需要用到的JAR包加入到WEBINF/lib目录下在ajax工程中文本采用的是UTF编码

创建HibernateSessionFactory

传统的方法就是在工程名上点右键选择MyEclipse>Add Hibernate Capabilities然后就是按照提示一步一步做不过在MyEclipse 中添加Hibernate还是只能支持除非你选择 Add Spring Capabilities里面才有Hibernate 的类库要想完全兼容JPA必须采用以上版本

这里大家直接使用源码中的HibernateSessionFactory注意请先建包reHibernateSessionFactory中有一个地方需要改动原来的写法是

privatestaticConfigurationconfiguration=newConfiguration();修改后为

privatestaticAnnotationConfigurationconfiguration=newAnnotationConfiguration();因为我们采用的是JPA注释方式来映射实体另外AnnotationConfiguration这个类在hibernateannotationsjar这个包中

创建BaseDao

在re包下面新建BaseDao抽象类里面定义的是持久化操作方法有一点特别要注意一定要在增加删除修改这几个方法中加入事务控制不管是在BaseDao基类方法中加还是在业务方法中加一定要加事务控制大象觉得在基类中加会比较好一点这样做代码显得更少更简洁如果不加事务控制那么增改这些操作都不会产生效果因为默认情况下它不会进行自动提交在做这个例子的时候这个问题曾经困扰了我好长时间因此请大家记住不要再犯和大象一样的错误!贴出部分代码详情请看源码里面有很全面的注释

/**

*抽象Dao类用于持久化操作

*@author菠萝大象

*@version

*/

publicabstractclassBaseDao<T>{

privatestaticLoglog=LogFactorygetLog(BaseDaoclass);

/**

*获取Hibernate的Session对象

*/

publicSessiongetSession(){

returnHibernateSessionFactorygetSession();

}

/**

*根据主键得到对象

*/

publicTgetObject(ClassclazzSerializableid){

return(T)getSession()get(clazzid);

}

/**

*保存对象

*/

publicvoidsaveObject(Tt){

Sessionsession=getSession();

Transactiontx=beginTransaction(session);

try{

sessionsaveOrUpdate(t);

mit();

}catch(Exceptione){

txrollback();

logerror(保存对象失败);

}

}

/**

*创建事务

*/

privateTransactionbeginTransaction(Sessionsession){

returnsessionbeginTransaction();

}

}创建Employee

在comajaxemployeemode包下新建Employee类这个就是POJO类下面来详细说明里面的含义

@Entity

@Table(name=EMPLOYEE)

publicclassEmployeeimplementsjavaioSerializable{

privateIntegeremployee_id;//人员ID(主键)

privateStringemployee_name;//人员姓名

privateStringsex;//性别

privateStringbirthday;//出生日期

privateStringaddress;//地址

@Id

@Column(name=EMPLOYEE_ID)

@TableGenerator(

name=tabstore

table=GENERATOR_TABLE

pkColumnName=G_KEY

pkColumnValue=EMPLOYEE_PK

valueColumnName=G_VALUE

allocationSize=

)

@GeneratedValue(strategy=GenerationTypeTABLEgenerator=tabstore)

publicIntegergetEmployee_id(){

returnemployee_id;

}

publicvoidsetEmployee_id(Integeremployee_id){

thisemployee_id=employee_id;

}

}其它几个属性的getter和setter省略这里我们要用到ejbpersistencejarJPA的注解类就在这个包中下面详细说明上面使用到的注解

@Entity通过@Entity注解将一个类声明为一个实体bean

@Table通过 @Table注解可以为实体bean映射指定表name属性表示实体所对应表的名称如果没有定义 @Table那么系统自动使用默认值实体的类名(不带包名)

@Id用于标记属性的主键

@Column表示持久化属性所映射表中的字段如果属性名与表中的字段名相同则可以省略@Column注解另外有两种方式标记一是放在属性前另一种是放在getter方法前例如

@Column(name=EMPLOYEE_NAME)

privateStringemployee_name;或者

@Column(name=EMPLOYEE_NAME)

publicStringgetEmployee_name(){

returnemployee_name;

}这两种方式都是正解的根据个人喜好来选择大象偏向于第二种并且喜欢将属性名与字段名设成一样的这样可以省掉@Column注解使代码更简洁

@TableGenerator表生成器将当前主键的值单独保存到一个数据库表中主键的值每次都是从指定的表中查询来获得这种生成主键的方式是很常用的这种方法生成主键的策略可以适用于任何数据库不必担心不同数据库不兼容造成的问题大象推荐这种方式管理主键很方便集中式管理表的主键而且更换数据库不会造成很大的问题各属性含义如下

name表示该表主键生成策略的名称这个名字可以自定义它被引用在@GeneratedValue中设置的generator值中

table表示表生成策略所持久化的表名说简单点就是一个管理其它表主键的表本例中这个表名为GENERATOR_TABLE

pkColumnName表生成器中的列名用来存放其它表的主键键名这个列名是与表中的字段对应的

pkColumnValue实体表所对应到生成器表中的主键名这个键名是可以自定义滴

valueColumnName表生成器中的列名实体表主键的下一个值假设EMPLOYEE表中的EMPLOYEE_ID最大为那么此时生成器表中与实体表主键对应的键名值则为

allocationSize表示每次主键值增加的大小例如设置成则表示每次创建新记录后自动加默认为

@GeneratedValue定义主键生成策略这里因为使用的是TableGenerator所以主键的生成策略为GenerationTypeTABLE生成主键策略的名称则为前面定义的tabstore

这里大象想说下网上有很多文章写的是strategy = GenerationTypeAUTO或是strategy = GenerationTypeSEQUENCE采用SEQUENCE序列是因为Oracle数据中不支持identity自动增长要想使用它还得在数据库中创建一个序列如果要更换数据库那将是一个非常麻烦的事情SEQUENCE生成方式我们暂且不谈这里说下采用AUTO和IDENTITY的生成方式本例采用的是SQL Server 作为数据库所以如果想使用AUTO或是IDENTITY生成策略则一定要对主键加上identity标识如identity()不过对于AUTO来说是根据不同的数据库选择最合适的自增主键生成策略如果使用MySQL则主键要定义AUTO_INCREMENT如果是Oracle则要创建Sequence来实现自增不管采用何种生成策略改这些方法中一定要加入事务否则数据是不会添加到数据库中滴~~~这是大象反复测试过的结果!

创建数据库及表

接下来我们需要为本例创建一个数据库及必要的表数据库名为ajax表只有两个EMPLOYEE和GENERATOR_TABLE下面是SQL脚本

CREATETABLEEMPLOYEE(

EMPLOYEE_IDintnotnull

EMPLOYEE_NAMEvarchar()null

SEXchar()null

BIRTHDAYvarchar()null

ADDRESSvarchar()null

CONSTRAINTPK_EMPLOYEEPRIMARYKEY(EMPLOYEE_ID)

)

CREATETABLEGENERATOR_TABLE(

IDintnotnull

G_KEYvarchar()null

G_VALUEintnull

CONSTRAINTPK_GENERATOR_TABLEPRIMARYKEY(ID)

)

INSERTINTOGENERATOR_TABLEVALUES(EMPLOYEE_PK)如果你觉得麻烦不想建库及表可以将后面的数据库下载下来然后还原数据库就可以了

修改hibernatecfgxml

本例中采用的是JTDS连接驱动我们要对配置文件作一些设置另外还要加入POJO类

<propertyname=dialect>orghibernatedialectSQLServerDialect</property>

<propertyname=connectiondriver_class>netsourceforgejtdsjdbcDriver</property>

<propertyname=connectionurl>jdbc:jtds:sqlserver://localhost:/ajax</property>

<propertyname=connectionusername>sa</property>

<propertyname=connectionpassword>自己密码(无密码就空着)</property>

<!实体类>

<mappingclass=comajaxemployeemodelEmployee/>以前没有使用JPA注解的时候我们这里加入的都是hbmxml文件现在我们则加入的是类

创建EmployeeManager

在comajaxemployeeservice下新建EmployeeManager类这里面就是写业务方法另外在这个类中添加一个main方法用于测试将logj的日志级别调整为DEBUG这样我们就可以看到很详细的程序运行信息源码中的注释很详细这里就不贴出来了

本例没有提供MySQL和Oracle数据库的脚本不过这些应该很简单按照最基本的方式建一个数据库和两张表就行了这里附上两种数据库的hibernate配置

MySQL

<propertyname=hibernatedialect>orghibernatedialectMySQLInnoDBDialect</property>

<propertyname=connectiondriver_class>commysqljdbcDriver</property>

<propertyname=connectionurl>jdbc:mysql://localhost:/ajax</property>

<propertyname=connectionusername>root</property>

<propertyname=connectionpassword>自己的密码(无密码就空着)</property>Oracle

<propertyname=hibernatedialect>orghibernatedialectOracleDialect</property>

<propertyname=connectiondriver_class>oraclejdbcdriverOracleDriver</property>

<propertyname=connectionurl>jdbc:oracle:thin:@::自己的SID</property>

<propertyname=connectionusername>system</property>

<propertyname=connectionpassword>自己的密码(无密码就空着)</property>本文主要是从实用的角度来说明如何在Hibernate中使用JPA注释来简化开发以及为后面的多种Ajax技术框架应用系列作一个前期准备从这里可以看出我们不需要再编写繁琐的hbmxml文件另外JPA的功能很强大这里只展示了其中的冰山一角如果想深入学习JPA的话请单独查找资料或购买相关书籍

下面是本例中必须的JAR包
点击下载antlrasmcglibcommonscollectionscommonslang

commonslogginglogjehcacheejbpersistence

hibernatehibernateannotationshibernatecommonsannotations

mysqlconnectorjar jtdsjar classesjar

点击下载ajax_project db_ajax

本文为菠萝大象原创如要转载请注明出处

上一篇:在Struts框架下使用时间类型

下一篇:浅谈Struts框架及其组成部分