hibernate注解.docx

上传人:b****5 文档编号:7423956 上传时间:2023-01-23 格式:DOCX 页数:50 大小:28.74KB
下载 相关 举报
hibernate注解.docx_第1页
第1页 / 共50页
hibernate注解.docx_第2页
第2页 / 共50页
hibernate注解.docx_第3页
第3页 / 共50页
hibernate注解.docx_第4页
第4页 / 共50页
hibernate注解.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

hibernate注解.docx

《hibernate注解.docx》由会员分享,可在线阅读,更多相关《hibernate注解.docx(50页珍藏版)》请在冰豆网上搜索。

hibernate注解.docx

hibernate注解

HibernateAnnotation

 

使用hibernateAnnotation来映射实体

准备工作

下载

hibernate-distribution-3.3.2.GA

hibernate-annotations-3.4.0.GA

slf4j

导入相关依赖包

HibernateHOME:

\hibernate3.jar

\lib\bytecode(二进制)

\lib\optional(可选的)

\lib\required(必须的)

导入required下的所有jar包

antlr-2.7.6.jar

commons-collections-3.1.jar

dom4j-1.6.1.jar

hibernate3.jar

javassist-3.9.0.GA.jar

jta-1.1.jar

slf4j-api-1.5.10.jar

slf4j-log4j12-1.5.10.jar

log4j-1.2.14.jar

mysql.jar

---Annotation包

ejb3-persistence.jar

hibernate-annotations.jar

hibernate-commons-annotations.jar

 

简单的例子,通过annotation注解来映射实体PO

1、建立(JavaProject)项目:

hibernate_0100_annotation_HelloWorld_default

2、在项目根下建立lib目录

a)导入相关依赖jar包

antlr-2.7.6.jar

commons-collections-3.1.jar

dom4j-1.6.1.jar

ejb3-persistence.jar

hibernate-annotations.jar

hibernate-commons-annotations.jar

hibernate3.jar

javassist-3.9.0.GA.jar

jta-1.1.jar

log4j-1.2.14.jar

mysql.jar

slf4j-api-1.5.10.jar

slf4j-log4j12-1.5.10.jar

3、建立PO持久化类cn.serup.model.Teacher内容如下

packagecn.serup.model;

importjavax.persistence.Entity;

importjavax.persistence.Id;

//@Entity表示该是实体类

@Entity

publicclassTeacher{

privateintid;

privateStringusername;

privateStringpassword;

//ID为主键,主键手动分配

@Id

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetUsername(){

returnusername;

}

publicvoidsetUsername(Stringusername){

this.username=username;

}

publicStringgetPassword(){

returnpassword;

}

publicvoidsetPassword(Stringpassword){

this.password=password;

}

}

4、在src目录中建立hibernate.cfg.xml(hibernate配置文件)文件,内容如下

DOCTYPEhibernate-configurationPUBLIC

"-//Hibernate/HibernateConfigurationDTD3.0//EN"

"

jdbc:

mysql:

//localhost/hibernate

root

saber

com.mysql.jdbc.Driver

org.hibernate.dialect.MySQLDialect

true

--独立线程运行,如果通过getCurrentSession()来获得Session,需要设置如下-->

thread

--映射持久化类-->

5.、建立新的源码包test

a)编写单元测试,结构如下cn.serup.hibernate.test.TeacherTest内容如下:

packagecn.serup.hibernate.test;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.cfg.AnnotationConfiguration;

importorg.hibernate.tool.hbm2ddl.SchemaExport;

importorg.junit.AfterClass;

importorg.junit.BeforeClass;

importorg.junit.Test;

importcn.serup.model.Teacher;

publicclassTeacherTest{

privatestaticSessionFactorysessionFactory;

@Test

publicvoidtestSaveTeacher(){

Teachert=newTeacher();

t.setId

(2);

t.setUsername("努尔哈赤");

t.setPassword("12345");

Sessionsession=sessionFactory.getCurrentSession();

session.beginTransaction();

session.save(t);

session.beginTransaction().commit();

}

@BeforeClass

publicstaticvoidbeforeClass(){

newSchemaExport(newAnnotationConfiguration().configure()).create(true,true);

sessionFactory=newAnnotationConfiguration().configure().buildSessionFactory();

}

@AfterClass

publicstaticvoidafterClass(){

sessionFactory.close();

}

}

 

Annotation表名称与字段映射,长度

1、项目:

hibernate_0200_annotation_column

2、表名称映射,在默认情况下使用@Entity,则使用类名做为表名

3、所有的注解写在get()方法上面

4、表名映射

a)@Table(name="t_teacher")

3、字段映射

a)默认情况下,则使用属性名称来作为列名(字段名)

b)在get()方法上写注解

i.@Column(name="t_username")

ii.长度

iii.@Column(name="t_username",length=35)

c)默认情况下会将所有的属性映射到表中,如果不想某个属性映射到表中,如下编写

i.@Transient(瞬时、临时(或者透明))

Annotation映射主键属性(ID生成策略)

1、项目:

hibernate_0300_annotation_ID

2、使用@Id注解可以将实体bean中的某个属性定义为标识符(identifier),该属性的值可以通过应用自身进行设置(ID手动分配,但不能重复)

3、(EJB3规范)也可以通过Hiberante生成(推荐).使用@GeneratedValue注解可以定义该标识符的生成策略:

∙AUTO-可以是identitycolumn类型,或者sequence类型或者table类型,取决于不同的底层数据库.

∙TABLE-使用表保存id值

∙IDENTITY-identitycolumn

∙SEQUENCE-sequence

AUTO相当于XML映射文件中的Native

4、AUTO,写上@GeneratedValue则会默认选择AUTO来生成主键,会根据你的方言来选择数据库提供的自增机制,作为主键的生产策略,如果数据库是MySQL,则使用auto_increment

@Id

@GeneratedValue

//或者@GeneratedValue(strategy=GenerationType.AUTO)

publicintgetId(){....}

5、IDENTITY取得最大的ID值+1,作为主键

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

publicintgetId(){....}

6、TABLE使用hilo(高低位算法,来产生主键)

@Id

@GeneratedValue(strategy=GenerationType.TABLE)

publicintgetId(){....}

7、SEQUENCEOracle的自增机制

@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE)

publicintgetId(){....}

使用Oracle的SEQUENCE的话。

他会自动建一张SEQUENCE表,默认表名hibernate_sequence

如果想改SEQUENCE表名的话。

如下编写

@SequenceGenerator(name="aa",sequenceName="teacherSEQ_DB")

publicclassTeacher{

@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="aa")

publicintgetId(){...}

}

说明:

@SequenceGenerator(name="aa",sequenceName="teacherSEQ_DB")

Name为引用名称sequenceName为表名称

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="aa")

使用类SEQUENCE为主键生成策略,更改表名,使用generator="aa"引用类上定义好的aa

Annotation关系映射

1、一对一外键关联映射(单向)

2、一对一外键关联映射(双向)

3、一对一主键关联映射(不重要)在这不演示

在实际中很少用,使用注解@PrimaryKeyJoinColumn

意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用

注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML

映射可以生成。

Annotation注解一对一主键关联映,有些bug。

不过没空去研究它。

因为在实际开发中一对一很少用。

在实际开发中我机会没有用过,主键关联就更少了

4、多对一关联映射

5、一对多关联映射(单向)

6、一对多关联映射(双向)

7、多对多关联映射(单向)

8、多对多关联映射(双向)

一对一外键关联映射(单向)

1、项目:

hibernate_0400_annotation_one2one_fk_1

2、建立PO

a)cn.serup.model.Body

b)cn.serup.model.Heart

packagecn.serup.model;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.Id;

importjavax.persistence.JoinColumn;

importjavax.persistence.OneToOne;

@Entity

publicclassBody{

privateintid;

privateStringbodyName;

privateHeartheart;

publicStringgetBodyName(){

returnbodyName;

}

@OneToOne(cascade=CascadeType.ALL)

@JoinColumn(name="bodyid",unique=true)

//一对一外键关联,使用@OneToOne,并设置了级联操作

//@JoinColum设置了外键的名称为bodyid如果不设置,则默认为heart_id

//外键的值是唯一的(unique),不可重复,与Heart的主键一直

publicHeartgetHeart(){

returnheart;

}

@Id

@GeneratedValue

publicintgetId(){

returnid;

}

publicvoidsetBodyName(StringbodyName){

this.bodyName=bodyName;

}

publicvoidsetHeart(Heartheart){

this.heart=heart;

}

publicvoidsetId(intid){

this.id=id;

}

}

packagecn.serup.model;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.Id;

@Entity

publicclassHeart{

privateintid;

privateStringheartName;

@Id

@GeneratedValue

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetHeartName(){

returnheartName;

}

publicvoidsetHeartName(StringheartName){

this.heartName=heartName;

}

}

编写单元测试cn.serup.hibernate.test.One2One_1

packagecn.serup.hibernate.test;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.cfg.AnnotationConfiguration;

importorg.hibernate.tool.hbm2ddl.SchemaExport;

importorg.junit.AfterClass;

importorg.junit.BeforeClass;

importorg.junit.Test;

importcn.serup.model.Body;

importcn.serup.model.Heart;

publicclassOne2One_1{

privatestaticSessionFactorysessionFactory;

@Test

publicvoidtestSaveTeacher(){

Hearth=newHeart();

h.setHeartName("h2");

Bodyb=newBody();

b.setBodyName("b2");

b.setHeart(h);

Sessionsession=sessionFactory.getCurrentSession();

session.beginTransaction();

session.save(h);

session.save(b);

session.beginTransaction().commit();

}

@Test

publicvoidtestLoadOne2One(){

Sessionsession=sessionFactory.getCurrentSession();

session.beginTransaction();

Bodyb=(Body)session.get(Body.class,1);

System.out.println(b.getId()+""+b.getBodyName());

Hearth=b.getHeart();

System.out.println(h.getId()+""+h.getHeartName());

session.beginTransaction().commit();

}

@Test

publicvoidtestDeleteOne2One(){

Sessionsession=sessionFactory.getCurrentSession();

session.beginTransaction();

Bodyb=(Body)session.get(Body.class,1);

session.delete(b);

session.beginTransaction().commit();

}

@BeforeClass

publicstaticvoidbeforeClass(){

newSchemaExport(newAnnotationConfiguration().configure())

.create(true,true);

sessionFactory=newAnnotationConfiguration().configure()

.buildSessionFactory();

}

@AfterClass

publicstaticvoidafterClass(){

sessionFactory.close();

}

}

一对一双向关联关系:

hibernate_0500_annotation_one2one_fk_2

改动Heart对象

packagecn.serup.model;

importjavax.persistence.CascadeType;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.Id;

importjavax.persistence.OneToOne;

@Entity

publicclassHeart{

privateintid;

privateStringheartName;

privateBodybody;

@OneToOne(mappedBy="heart",cascade=CascadeType.ALL)

//一对一双向关联关系,使用@OneToOne

//注意:

需要加上mappedBy="heart",如果不加上的话,

//Heart也会生成一个外键(body_id)

//mapped="heart"需要指向与他关联对象的一个属性

//说明双向关联关系中,有且仅有一端是作为主体(owner)端存在的

//主体端负责维护联接列

//对于不需要维护这种关系的从表则通过mappedBy属性进行声明

//mappedBy的值指向主体的关联属性

//规律:

只有是双向关联关系,都加上mapped

//cascade=CascadeType.ALL级联

publicBodygetBody(){

returnbody;

}

publicvoidsetBody(Bodybody){

this.body=body;

}

@Id

@GeneratedValue

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicStringgetHeartName(){

returnheartN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1